位图和精灵(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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




