手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>delphi>列表

用Delphi DirectX开发简单RPG游戏

来源:互联网 作者:西部数码 时间:2008-04-09
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

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, 1);{设定背景显示样式为1×1}
Image := ImageList.Items.Find(''''background''''); {载入背景图片}
Z := -2; {设定背景层次}
Tile := True; {设定背景填充样式为平铺}
end;

PlayerSprite := TPlayerSprite.Create(DXSpriteEngine.Engine);
with TPlayerSprite(PlayerSprite) do
begin
Image := ImageList.Items.Find(''''player'''');
Z := 2;
Width := Image.Width;
Height := Image.Height;
end;
{载入游戏人物}
end;

procedure TMainForm.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
{如果按了Esc,则退出}
if Key=VK_ESCAPE then
Close;

{全屏模式和窗口模式的切换}
if (ssAlt in Shift) and (Key=VK_RETURN) then
begin
DXDraw.Finalize;

if doFullScreen in DXDraw.Options then
begin
RestoreWindow;

DXDraw.Cursor := crNone;
BorderStyle := bsSizeable;
DXDraw.Options := DXDraw.Options - [doFullScreen];
end else
begin
StoreWindow;

DXDraw.Cursor := crNone;
BorderStyle := bsNone;
DXDraw.Options := DXDraw.Options [doFullScreen];
end;

DXDraw.Initialize;
end;
end;

procedure TMainForm.DXDrawMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
AnchorX := x Trunc(PlayerSprite.x)-320;
AnchorY := y Trunc(PlayerSprite.y)-240;
{将鼠标在屏幕上点击的位置转换到游戏世界中}
PlayerSprite.CanMove:=True;

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!