p;{自定义游戏中所用到的方向}
TPlayerSprite = class (TImageSprite) CanMove: Boolean; protected procedure DoMove(MoveCount: Integer); override; procedure MoveTo(MoveCount:Integer; Direction: TDirection); procedure DoCollision(Sprite: TSprite; var Done: Boolean); override; end;
TMainForm = class(TDXForm) {此处使用优化过的TDXForm来代替TForm} DXTimer: TDXTimer; DXDraw: TDXDraw; DXSpriteEngine: TDXSpriteEngine; DXInput: TDXInput; ImageList: TDXImageList; procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure DXDrawFinalize(Sender: TObject); procedure DXDrawInitialize(Sender: TObject); procedure FormCreate(Sender: TObject); procedure DXTimerTimer(Sender: TObject; LagCount: Integer); procedure DXDrawMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure DXDrawMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure DXDrawMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure FormClose(Sender: TObject; var Action: TCloseAction); private AnchorX: Integer; AnchorY: Integer; {鼠标点击发生的位置} MouseX: Integer; MouseY: Integer; {鼠标当前位置} PlayerSprite: TPlayerSprite; {游戏中我们所用鼠标控制的人物} BackSprite: TBackGroundSprite; {游戏的背景图} end;
const speed=5; {游戏人物向各个方向运动时的动画播放速度}
var MainForm: TMainForm; Steps: Integer; {用于控制切换精灵动画图片的参数}
implementation
{$R *.DFM}
procedure TPlayerSprite.DoCollision(Sprite: TSprite; var Done: Boolean); begin Done:=False; {已经侦测到碰撞,不再重复检测碰撞} {检测游戏人物是否与其它精灵发生了碰撞,此处可以扩展为对话等情节} end;
procedure TPlayerSprite.DoMove(MoveCount: Integer); var l,r,d,u: Boolean; absX,absY: Integer; {游戏人物的当前位置与目的地的绝对距离} begin inherited DoMove(MoveCount); MoveCount:=Trunc(MoveCount*1.5); l:=false; r:=false; u:=false; d:=false;
if (Trunc(X)-MainForm.AnchorX>0) then l:=true else r:=true; if (Trunc(Y)-MainForm.AnchorY>0) then u:=true else d:=true;
absX:=abs(Trunc(X)-MainForm.AnchorX); absY:=abs(Trunc(Y)-MainForm.AnchorY);
if absX<4 then begin l:=false; r:=false; end; if absY<4 then begin u:=false; d:=false; end; {如果绝对距离已经小于四个象素,则认为已经到达目的地}
if u and l and not d and not r then MoveTo(MoveCount,DrUpLeft); if u and r and not l and not d then MoveTo(MoveCount,DrUpRight); if d and l and not r and not u then MoveTo(MoveCount,DrDownLeft); if d and r and not u and not l then MoveTo(MoveCount,DrDownRight); if d and not l and not r and not u then MoveTo(MoveCount,DrDown); if u and not l and not r and not d then MoveTo(MoveCount,DrUp); if l and not u and not r and not d then MoveTo(MoveCount,DrLeft); if r and not l and not u and not d then MoveTo(MoveCount,DrRight); {根据目的地来判断运动的方向,从而播放相应方向运动的动画}
Collision; {检测碰撞} Engine.X := -X+Engine.Width div 2 - Width div 2; Engine.Y := -Y+Engine.Height div 2 - Height div 2; {移动引擎,从而是游戏人物处于舞台的正中央} end;
procedure TMainForm.DXTimerTimer(Sender: TObject; LagCount: Integer); begin if not DXDraw.CanDraw then exit; {检测DXDraw是否可以画,否则退出} DXInput.Update; {捕捉各类设备输入,这里我们用来检测鼠标的输入}
LagCount := 1000 div 60; {用来控制整个游戏运行速度的参数} DXSpriteEngine.Move(LagCount); DXSpriteEngine.Dead;
DXDraw.Surface.Fill(0); {将整个屏幕填充为黑色} DXSpriteEngine.Draw;
with DXDraw.Surface.Canvas do begin brush.style:=bsclear; pen.style:=psclear; pen.color:=clwhite; Font.Color:=clWhite; Font.Size:=10;
textout(10,10,''''Press ESC to Quit''''); textout(100,100,''''X: ''''+IntToStr(AnchorX)+''''Y: ''''+IntToStr(AnchorY)); {鼠标点击的位置经转换后在游戏世界中的坐标} textout(100,200,''''Sprit x:''''+IntToStr(Trunc(PlayerSprite.x))+''''Y: '''' +IntToStr(Trunc(PlayerSprite.y))); {精灵在游戏世界中的坐标} textout(100,300,''''Relative x:''''+IntToStr(AnchorX-Trunc(PlayerSprite.x))+''''Y: '''' +IntToStr(AnchorY-Trunc(PlayerSprite.y))); {精灵当前位置与目的地之间的绝对距离} textout(200,100,''''Mouse x:''''+IntToStr(MainForm.MouseX)+''''Y: '''' +IntToStr(MainForm.MouseY)); {鼠标当前位置,相对于窗口左上角,未转换为游戏世界坐标} Release; end; {在字母上输出相应参数,用于程序调试} DXDraw.Flip; {将内存中的后台表面翻转到当前并且显示} end;
procedure TMainForm.DXDrawFinalize(Sender: TObject); begin DXTimer.Enabled := False; {关闭定时器} end;
procedure TMainForm.DXDrawInitialize(Sender: TObject); begin DXTimer.Enabled := True; {启动定时器} end;
procedure TMainForm.FormCreate(Sender: TObject); begin Steps:=0; AnchorX:=0; AnchorY:=0;
MouseX:=320; MouseY:=240; {默认使鼠标处于屏幕的中央}
ImageList.Items.MakeColorTable;
DXDraw.ColorTable := ImageList.Items.ColorTable; DXDraw.DefColorTable := ImageList.Items.ColorTable; DXDraw.UpdatePalette; {更新系统调色板}
BackSprite:=TBackgroundSprite.Create(DXSpriteEngine.Engine); with TBackgroundSprite(BackSprite) do begin SetMapSize(上一页 [1] [2] [3] 下一页 |