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

用Delphi DirectX开发简单RPG游戏

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


位图和精灵(Bitmaps and Sprites)
精灵是指在游戏中用来实现动画效果的一组图片,这些图片通常采用位图格式,并且有用特定颜色填充的透明区域。如下图,就是一个精灵。

[ 相关贴图 ]

图中的用黑色填充部分就是预先所定义的透明区域,在游戏中,我们按照白色线条可以将整个图片分别切开成9块,每块的大小均为80×50。我们先从左向右,然后在从上往下对起进行编号为1~9。如果我们将这九张图片依次循环显示出来,并且设置播放的速度为每秒24张,我们就可以得到一个飞船在旋转的动画,也就是一个飞船精灵。



开发过程
  说了许多废话以后,下面我们脱离纸上谈兵,开始正式的开发。在本例中,我们主要实现用鼠标来控制精灵往八个方向行走。所有图片均来自大宇公司《轩辕剑叁——天之痕》,其中精灵采用故事中陈靖仇的形象特此致谢。同时,请各位读者勿把这些图片用于商业用途,否则后果自负。
[ 相关贴图 ]

background.bmp
[ 相关贴图 ]

player.bmp

  打开 Delphi 并新建一个应用程序,依次选中 DelphiX 组件栏的 TDXDraw、TDXImageList、TDXInput、TDXTimer、TDXSpriteEngine 组件,添加到用户区,分别命名为 DXDraw、DXImageList、DXInput、DXTimer、DXSpriteEngine,按照下表设置其各项属性。对于 DXImageList,点击 Object Inspector 中的 Items,在其中加入两张位图(background.bmp和player.bmp),分别命名为 background 和 player,设置 player 的 PatternHeight 和 PatternWidth 均为120象素,设置其 transparentcolor 为粉红色(clFuchsia)。

控件 属性 值

DXDraw Align alClient
Display.Width 800
Display.Height 600
Display.BitCount 24
Options [doAllowReboot, doWaitVBlank, doCenter, doFlip]
AutoInitialize True
DXTimer Enabled True

Interval 0
DXInput Mouse.BindInputState True
Mouse.Enabled True
DXSpriteEngine DXDraw DXDraw


  下面就是全部的源程序,请先在 Delphi 中产生相应事件然后填入代码,最后按下F9运行就可以运行程序了。用鼠标点击你的目的地,陈靖仇就会自动跑到指定地点。尝试一下开发一些简单的游戏吧,用 DelphiX 这把牛刀!所有程序在 Delphi 4.0 DirectX 8.0 环境下测试通过。本文所需控件可以在 这里 下载。

Unit Main;
Interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls, Menus, DXClass, DXSprite, DXInput, DXDraws;

type

TDirection = (DrUp, DrDown, DrLeft, DrRight, DrUpLeft, DrUpRight, DrDownLeft, DrDownRight);
{自定义游戏中所用到的方向}

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);

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