代码改变世界

DelphiX教程系列 4 - 滚动背景 part 1

2008-08-21 17:07  Nicholas Yuen  阅读(1027)  评论(0编辑  收藏  举报
用到的组件:(TDXDraw, TDXImageList, TDXSpriteEngine, TDXTimer, TDXInput)
TDXDraw TDXImageList TDXSprite TDXTimer TDXInput

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

在前一教程中,我们学习如何使用DXDraw和其他相关组件。在本教程里,我们将进一步学习如何利用键盘或游戏控制杆(joystick)/游戏板(joy pad)来移动精灵,并介绍DelphiX里滚动背景的概念。

首 先是添加背景。我们在DXTimer组件里创建它,那么就可以在每个动画之前将其重绘(redrawing)。这样,我们只需要通过创建一个 TBackgroundSprite的特殊精灵类来滚动背景图片(像Pacman和Ghost精灵一样)。我们为背景精灵类命名为 TScrollingBackground。下面的代码应该放在创建Pacman和ghost精灵类型的代码后面。

TScrollBackground = class(TBackgroundSprite)
public
  procedure
DoMove(MoveCount: Integer); override;
end;

接着我们在var声明区域的Ghost:TGhost;这行代码后面声明TScrollingBackground类型的变量:

Background: TScrollBackground;

为了完成背景的创建,我们还需要在FormCreate过程的开头添加如下代码:

Background := TScrollBackground.Create(DXSpriteEngine1.Engine);
with Background do
begin

  SetMapSize(640, 480);
  Image := DXImageList1.Items.Find('NewBackground');
  Y := 10;
  Z := -13;
end;

上面的代码假设您已经在DXImageList组件里添加一张名为NewBackground的图片(其大小为640x480)。

So far so good.我们不用在OnTimer过程里写DXImageList1.Items[1].Draw(DXDraw1.Surface,0,0,0);这 行了,因为现在由TBackgroundSprite来自动处理。当您删除这行后,编译出来的程序还是跟之前一样,但是背景则换成 'NewBackground'的图像了。我们现在来处理背景的滚动效果。考虑到这种种变化,我们需要修改DXTimer.OnTimer的代码。在这之 前,先让我们添加DXInput组件。

在上一教程里,我们让程序来控制精灵的移动,但在这里我们要让用户控制至少一个精灵。那么之前介绍的DXInput组件将变得很有用,我们只需稍微修改一下之前的代码就能令其好好工作了。

但您为窗体添加了DXInput组件后,您需要修改DXTimer.OnTimer的代码:

DXInput1.Update;

if isLeft in DXInput1.States then begin
  Pacman.AnimStart := 2;
  Ghost.AnimStart := 2;
  Background.X := Background.X + 1;
end;

if isRight in DXInput1.States then begin
  Pacman.AnimStart := 0;
  Ghost.AnimStart := 0;
  Background.X := Background.X - 1;
end;

if isUp in DXInput1.States then
  Pacman.Y := Pacman.Y -1;

if isDown in DXInput1.States then
  Pacman.Y := Pacman.Y +1;

DXSpriteEngine1.Move(2);
DXSpriteEngine1.Draw;
DXDraw1.Flip;

跟 之前的OnTimer代码相比,最后的那三行代码还在。添加的代码都是用来控制精灵的移动。在程序中,我们想在按下左或右方向键的时候令背景跟随精灵一起 移动。要做到这样,我们只需在向左或向右的时候减少或增加背景的X坐标值(例如:Background.X := Background.X + 1;)。当用户按下上或下方向键时,我们只需另精灵向上或下移动,但你也可以写一些使精灵跳跃的代码。我们也可以像Pacman精灵一样,在 TScrollingBackground.DoMove过程里编写滚动背景的代码。

在您运行程序前,你需要除去TPacman.Domove过程里的PixelCheck := True;和Pacman.X := Pacman.X + 1这两行代码,后代码如下:

procedure TPacman.DoMove(MoveCount: Integer);
begin
  inherited;
  if
PacmanDead = False then begin
    Collision;
  end else
end;

这将不会触发任何碰撞。我们只是把它留在那里(当您需要用到的时候)。

That’s it.只需简单地修改一下代码,我们就能实现许多新的功能。如果您有任何问题或建议,请e-mail到ben@delphigamedev.com或在论坛给我留言。在下一教程见。enjoy :-)


版权说明

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

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

作者:Nicholas.Yuen
网名:小丸
Email:ruanjiayuan AT gmail.com ( AT -> @)
Blog List:
http://genkagen.blogspot.com
http://ruanjiayuan.blog.163.com
http://randomforce.cnblogs.com
http://hi.baidu.com/genkagen
时间:2008.08.21
Copyright: 2008 Nicholas.Yuen All right resver

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