代码改变世界

DelphiX教程系列 5 - 鼠标

2008-08-23 17:11  Nicholas Yuen  阅读(1075)  评论(3编辑  收藏  举报
用到的组件(TDXDraw、TDXImageList、TDXSpriteEngine、TDXTimer、TDXInput): TDXDraw TDXImageList TDXSprite TDXTimer TDXInput

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

本教程不打算完整地介绍DelphiX里的鼠标控制,只是简单地介绍一下。首先您要熟悉教程13 ,里面详细讲述了鼠标操作,这里会用到里面部分知识。您将发现在DelphiX里也可以用上同样的命令,不同的是DelphiX需要一些额外的代码(我们在下面会讲述到)。

为了演示如何实现鼠标操作,最好的办法是打开之前完成的代码并修改之。让我们打开本套教程4的代码并为Pacman添加“自爆”(blow up)的能力(当您点击它时)。您应该还记得当Pacman碰上Ghost时它将自爆,这样的功能已经存在我们的代码中了,我们只需添加触发它自爆的代码(在点击它时)就行了。

Just get on with it
或许您已经发现,DelphiX的GetSpriteAt的用途有限。最好的实现方法是,不使用普通的鼠标(mouse cursor),改用一个游标类型的精灵,该精灵能准确地反映鼠标在屏幕上的X、Y坐标。这意味这我们能利用精灵的DoCollision代码,看看Pacman精灵是否与游标精灵相碰撞。这样一来,工作就变得很简单了。首先,我们需要创建一个游标类的精灵(跟先前的差不多)。在声明Pacman、Ghost和Background精灵的后面输入如下代码:

TCursorSprite = Class(TImageSprite)

end;

您注意到这比之前声明的方式要简短多了,如果您下载了本教程的代码,您将看到我把其中声明DoMove和DoCollision过程注释掉了,如果您有自定义的Domove和DoCollision过程,可以反注释这几行。但在本例中,我们不需要这些过程。

像我们之前做过的一样,为新的精灵类型指派一个变量,在var声明区域添加如下代码:

MouseCursor : TCursorSprite;

现在您需要在FormCreate过程里添加下面的代码,为鼠标游标(mouse cursor)配置细节。这些代码假设在ImageList中有一张名为Cursor的图像(用来表示鼠标指针)。您可以利用下面的图片或创建适合自己的图片。

MouseCursor := TCursorSprite.Create (DXSpriteEngine1.Engine);

MouseCursor.Image := DXImageList1.Items.Find('Cursor');

MouseCursor.Z := 10;

这只是创建该图片的游标精灵,并确定修改其Z坐标值使之置于其他精灵之上(您可以尝试删除最后一行代码来看看结果如何)。

我们还需要使游标精灵跟随鼠标移动。这很容易实现。在窗体上点选DXDraw组件,为其创建OnMouseMove事件,并添加下面两行代码:

MouseCursor.X := X;
MouseCursor.Y := Y;

我们只是在鼠标每次移动过程中,改变MouseCursor精灵的X和Y坐标为鼠标的坐标。在我们处理鼠标的单击事件前,先创建一个新的布尔(Boolean)类型变量——LeftBtnDown(在var区域声明)。接下来在OnMouseDown事件里添加下面代码:

if Button = mbLeft then LeftBtnDown := True;

它检查鼠标的左键是否按下了(您可以使用mbRight来检查右键),并将LeftBtnDown设置为True。如果您在OnMouseUp事件里添加下面的代码,那么我们就能在鼠标左键松开的时候把LeftBtnDown重新设置为False。

if Button = mbLeft then LeftBtnDown := False;

我们将如何利用LeftBtnDown变量来响应用户的按键呢?我们在TPacman.doCollision过程里修改代码,让程序知道鼠标指针在Pacman精灵上点击了。代码如下:

procedure TPacman.DoCollision(Sprite: TSprite; var Done: Boolean);
begin

 if Sprite is TGhost then
 begin
  // Nothing just now
 end;

 if
Sprite is TCursorSprite then
 begin

  //Also check that left mouse button is down
  if LeftBtnDown then
   begin

    // Set up the explosion
    Pacman.Image := Form1.DXImageList1.Items.Find('Explode');
    Pacman.Width := 28;
    Pacman.Height := Pacman.Image.Height;
    Pacman.AnimCount := 5;
    Pacman.AnimLooped := False;
    Pacman.AnimSpeed := 50/1000;
    Pacman.AnimStart := 0;
    PacmanDead := True;
   end;
 end;
end;

我们只是将Pacman“自爆”的代码从TGhost里抽出来,并放到新的精灵——TCursorSprite里面去而已。接着通过LeftBtnDown来检查鼠标左键是否被按下了,如果是,则令Pacman自爆 :)

如果您现在就运行代码,您将看到2个游标:精灵游标和系统默认的鼠标,所以我们还需要把当前系统的鼠标隐藏起来。根据您自定义的游标,您将看到游标精灵在不正确的地方出现,这很容易解决,只需要修正一下精灵的X和Y坐标就可以了。为了移除系统默认的鼠标,您需要在DXDraw1Initialize过程里添加下面的代码:

Screen.Cursor := crNone;

OK,您现在可以在DelphiX游戏里使用鼠标了。祝您愉快:)

本套教程只是个别地介绍了DelphiX里的组件,例子也很简单。如果您把它们拼合起来,您也可以创造出好玩的游戏来。祝您好运。


版权说明

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

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

作者: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.23
Copyright: 2008 Nicholas.Yuen All right resver

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