代码改变世界

DelphiX教程系列 3 - 动画 part 2

2008-08-18 21:40  Nicholas Yuen  阅读(1326)  评论(0编辑  收藏  举报
用到的组件(TDXDraw,TDXImageList,TDXSpriteEngine):  TDXDraw TDXImageList TDXSprite


原文链接:http://www.delphigamedev.com/tutorials/dxtut3b.htm
代码下载

 

DXSpriteEngine组件

该组件允许我们在游戏中引入多个精灵(Sprite)(如果需要的话),而且您可以很容易地移动它们,或做成动画效果,并在相互碰撞的时候销毁它们。

您把它添加到窗体上时,记得首先把它的DXDraw属性设置为DXDraw1。每当添加有DXDraw属性的DelphiX组件时,您都应该首先设置该属性,因为在后面您会很容易忘记设置它,并带来许多不必要的麻烦。

与您之前所用的组件不同的是,它在对象浏览器中没有相关Event项目。取而代之的是,它为我们提供了更多的特性(用代码来控制)。为了使用到这些特性,我们需要在varimplementation之前添加如下代码来创建我们的精灵(sprite):

TPacman = class(TImageSprite)
public
 procedure DoMove(MoveCount: Integer); override;
end;

这样就创建了一个图片类型的精灵(image sprite)——TPacman,并添加了一个与之相关的过程来处理精灵的移动。接着我们在代码里的var声明区域中添加下面一行代码来创建该类型精灵的变量——Pacman。

Pacman: TPacman;

通过TPacman,您可以按照喜好创建多个精灵。我们可以利用相同的代码和外观来创建多个在周围移动的敌人,而且不用重复编写代码。在这里,我们只要一个使用TPacman的精灵。我们虽然还没有创建出精灵,但是已经为我们的黄色小家伙打好了基础。为了在屏幕上创建出精灵,我们需要在窗体的OnCreate事件里添加如下的代码:

Pacman := TPacman.Create(DXSpriteEngine1.Engine);
Pacman.Image := Form1.DXImageList1.Items.Find('Pacman');
Pacman.X := 10;
Pacman.Y := 10;
Pacman.Height := Pacman.Image.Height;
Pacman.AnimCount := 2;
Pacman.AnimStart := 0;
Pacman.AnimLooped := True;
Pacman.AnimSpeed := 50/1000;

第一行代码创建了我们刚刚声明的Pacman变量的实例。第二行代码则从DXImageList组件中指派了一张图片给它(Pacman)。我们使 用的这张图片在下面可以看到,并且在Image list中我把它把它命名为Pacman。还有稍后用到的ghost精灵图片都是由Dicon Peeke友好提供的(他允许我们在游戏中自由的使用这些图片)。在这一行代码中,我们通过使用图片名字(代替其序号)找出图片。这样做有2个好处。第 一,我们可以清楚的看到使用的是哪一张图片。第二,当图片在image List中的顺序发生变化时也不会出现问题。

Pacman Sprites

下面的两行代码设置了精灵在屏幕上开始位置的坐标(10,10)。接着我们把精灵的高度设置为图片的高度(精灵的 宽度稍后再设置)。下一行代码则设置了我们要用到的动画单元格(animation ‘cell’)的数目。上面的图片中有8个单元格,但在这里我们只用开头的两个。接下来的那一行代码指定了从哪个单元格开始,在这里是从第一格(从0开始 算起)开始。如果我们指定为2(cell 2),则用的是第三,四个单元格。其后的那一行代码设置了动画循环播放(looped)。最后一行代码则设置了精灵动画帧切换的速度。

之前我曾提到过我们要设置精灵的宽度。显然,我们的程序不能辨别每个精灵图片的起始和终结位置,因此,我们要告诉程序精灵的宽度(在这里是28像素 那么高)。为了设置宽度,我们需要回到Pacman的属性窗口(在Image List的Items属性点击'...'按钮后选择,如下图)。我们把它的PatternWidth属性设置为28。也许您需要再添加一张图片用作背景 (背景图片大小为640x480,位图图片)。

DXImageList.Item Properties

当我们从DXImageList的Items对话框选中Pacman时所显示出来的属性列表。

现在介绍本教程最后一个组件——DXTimer。它的工作原理跟之前使用过的Timer组件差不多,只是多了一些附加的特性。但您把该组件添加到窗 体上的时候,设置其Enabled属性为false,interval属性为1。接着在DXTimer的OnTimer事件里输入下面的代码。注意,当您 在Timer组件上双击的时候它会进入OnTimer事件的代码编写状态,但是在DXTimer上双击则进入OnActivate事件,所以您需要在 DXTimer的事件列表上的双击OnTimer。

DXImageList1.Items.Find('Background').
Draw(DXDraw1.Surface,0,0,0);

DXSpriteEngine1.Move(2);

DXSpriteEngine1.Draw;

DXDraw1.Flip;

让我们来看一下这4行代码。第一行代码把背景预先画到屏幕的表面上(the surface of our screen),并允许我们在其新的位置上画出精灵。第二行代码实现精灵的移动(这将实现Pacman精灵的DoMove过程里的动作效果,我们稍后编写 其代码)。括号里的数字表示执行动画的速度(跟精灵的AnimSpeed属性一样,但是当您有多个精灵的时候,您可以利用它在同一时间内加快所有的动 画)。第三行则把我们刚才所做的画到DXDraw的表面上(在背景之上)。第四行代码的作用是,在屏幕上把刚才所做的所有东西翻转(Flip)到可视状 态。完成这些之后,那么我们在屏幕上移动精灵时就不会出现闪烁和拖影的效果。余下的工作是:设置计时器(timer)何时激活与停止,还有在屏幕上如何移 动精灵。为了是计时器生效,我们需要在DXDraw组件的OnInitialize事件中添加如下代码:

DXTimer1.Enabled := True;

and the following code in the OnFinalize event:
在其OnFinalize事件里添加如下代码:

DXTimer1.Enabled := False;

这将在DXDraw组件激活的时候令计时器生效,并在程序关闭(按下ESC键)的时候使之失效。我们现在需要为Pacman的移动编写如下代码(在implementationend.之间的地方)。

procedure TPacman.DoMove(MoveCount: Integer);
begin
inherited;

 Pacman.X := Pacman.X + 1;
end;

这行代码的作用是改变Pacman的X坐标,每次向右移动1个像素。您可以在这里做所有的事情,包括阻止精灵离开屏幕和沿Y轴移动的代码。您现在可 以运行您的杰作了,还不错吧。它可能已经变得很复杂了,但是您应该知道如何修改代码以符合自己的要求。您可以在这部分教程的下载文档里找到另一个程序(里 面有精灵和ghost)。在本教程的第三部分将会讲述和实现这个程序。


版权说明

本系列译文在博客园发表,除允许在互联网上自由转载外,不允许以其它任何方式拷贝、编辑、印刷出版、制作发行及传播,包括 不允许在笔者未知晓的情况下制作成各种格式的电子文档并传播,更不得在未经笔者本人允许的情况下以任何形式的拷贝用于商业用途。笔者对本系列译文保留有追 究其侵权责任的权利。

若需制成电子文档并用于非商业用途方式的传播,请保留以下版权信息,并与笔者联系邮寄副本一份。

作者:Nicholas.Yuen
网名:小丸
Email:ruanjiayuan AT gmail.com ( AT -> @)
Blog:
http://genkagen.blogspot.com
http://ruanjiayuan.blog.163.com
http://randomforce.cnblogs.com
http://hi.baidu.com/genkagen

时间:2008.08.18
Copyright: 2008 Nicholas.Yuen All right resver

PS:转载请保留以上版权信息