📄 gameobject_player_plane.cs
字号:
using System;
using System.Reflection;
using Microsoft.DirectX.DirectInput;
using DDGameHelper;
namespace ddt2
{
/// <summary>
/// GameObject_Player_Plane 的摘要说明。
/// </summary>
public class GameObject_Player_Plane : GameObject
{
/// <summary>
/// 同类型的GameObj计数器(主要作用于资源管理。当 counter > 0 时,即便调用 dispose 也不释放 resource)
/// </summary>
private static int _counter = 0;
/// <summary>
/// 指向 BmpRectCombo Collection 的 索引
/// </summary>
private static int _indexOfBmpRectComboCollection = 0;
private double _maxX = 0.0, _maxY = 0.0; //临时用用,越界判断
private int _middF = 0; //中间帧,控制飞机恢复平衡显示(无控制状态frame自动向中间靠拢)
private double _middT = 0.0, _lastT = 0.0; //中间帧的时间
private double _spaceKeyTime; //空格键发生数的节制
private bool _spaceKey; //空格键发生数的节制
public override int IndexOfBmpRectComboCollection()
{
return _indexOfBmpRectComboCollection;
}
public override string Name()
{
return _type.ToString();
}
public override object Properties()
{
return null;
}
private static GameObject_Enum _type = GameObject_Enum.Player_Plane;
public override int Type()
{
return (int)_type;
}
public GameObject_Player_Plane(double x, double y, double velX, double velY, double velF, ref GameLoopHandler gameLoopHandler) : base(ref gameLoopHandler)
{
BmpRectCombo brc= ((BmpRectCombo)_bmpRectComboCollection[_indexOfBmpRectComboCollection]);
_velF = velF;
_x=x; _y=y;
_velX=velX; _velY=velY;
_maxX = GameSettings._screenWidth - brc.RectangleArray.Rectangles[0].Width;
_maxY = GameSettings._screenHeight - brc.RectangleArray.Rectangles[0].Height;
_lastF = brc.RectangleArray.Rectangles.Length - 1;
_middF = _lastF / 2;
_lastT = brc.RectangleArray.Rectangles.Length * _velF;
_middT = _lastT / 2;
_currF = _middF;
_currT = _middT;
}
protected override void Init()
{
LoadResource();
}
protected override void LoadResource()
{
_counter++;
if(_counter==1)
{
BitmapObject bo = new BitmapObject(BitmapDisplayType.Transparent, GameSettings.GetResourceStream("ddt2.Resource.Picture.Player_Plane_1.png"));
RectangleArray ra = new RectangleArray(bo.Size.Width, bo.Size.Height, 50, 56, 0);
DDHandler d=_glh.DDHandler;
_indexOfBmpRectComboCollection = _bmpRectComboCollection.Add(new BmpRectCombo(ref bo, ref ra, ref d));
}
}
protected override void UnloadResource()
{
_counter--;
if(_counter==0)
{
_bmpRectComboCollection[_indexOfBmpRectComboCollection] = null;
}
}
public override void Process()
{
double elapsedTime=_glh.LoopDuration;
//处理飞行方向与 frame 显示的关系
if (_x == _lastX) //未移动, frame 向中间那帧转变(加进了防止颤动的处理)
{
if(_currT < _middT)
{
if(_currT + elapsedTime > _middT) _currT = _middT;
else _currT += elapsedTime;
}
else if(_currT > _middT)
{
if(_currT - elapsedTime < _middT) _currT = _middT;
else _currT -= elapsedTime;
}
}
else if (_x > _lastX) //正在向左移, frame 向左边转变
{
_currT += elapsedTime;
}
else //正在向右移, frame 向右边转变
{
_currT -= elapsedTime;
}
//越界处理
if(_x>_maxX)_x=_maxX;
if(_x<0)_x=0;
if(_y>_maxY)_y=_maxY;
if(_y<0)_y=0;
if(_currT<=0)_currT=1;
if(_currT>=_lastT)_currT=_lastT-1;
_currF = (int)(_currT / _velF);
//碰撞检测
//
_lastX = _x; _lastY = _y;
}
public override void Process(ref Microsoft.DirectX.DirectInput.KeyboardState ks)
{
bool left,right,up,down;
double elapsedTime=_glh.LoopDuration;
left=ks[Key.LeftArrow]||ks[Key.NumPad4]; right = ks[Key.RightArrow]||ks[Key.NumPad6];
up = ks[Key.UpArrow]||ks[Key.NumPad8]; down = ks[Key.DownArrow]||ks[Key.NumPad2];
if(left & !right)_x-=elapsedTime/_velX;
else if(!left & right)_x+=elapsedTime/_velX;
if(up & !down)_y-=elapsedTime/_velY;
else if(!up & down)_y+=elapsedTime/_velY;
double x,y,vx,vy,vf;
if(ks[Key.Space] || ks[Key.LeftControl])
{
if(_spaceKey)
{
_spaceKeyTime+=_glh.LoopDuration;
if(_spaceKeyTime>50)
{
_spaceKeyTime-=50;
_spaceKey=false;
}
}
else
{
_spaceKey=true;
x=_x+9;
y=_y-20;
if(y<0)y=0;
if(x<0)x=0;
vx=_glh.RandoM.NextDouble()*20+5;
vy=_glh.RandoM.NextDouble()*20+5;
vf=_glh.RandoM.NextDouble()*78+2;
_glh.GameObjectCollection.Add(new GameObject_Sprite(x,y,vx,vy,vf,AnimatePlayMethods.Reverse,true,ref _glh));
FireSound();
//_glh.GameObjectCollection.Add(new GameObject_Blast1(x,y,vx,vy,80,ref _glh));
}
}
else
{
_spaceKey=false;
}
}
private void FireSound()
{
_glh.DSHandler.Stop();
_glh.DSHandler.LoadSoundFile(GameSettings.GetResourceStream("ddt2.Resource.Sound.plane_shoot.wav"));
_glh.DSHandler.Play();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -