使用Asphyre4.10和SpriteEngine开发游戏

简介:
之前我写过一篇《使用Asphyre开发游戏的方式 》的文章。文章中简述了如果使用asphyre3.10来开发游戏。但是使用asphyre3.10来开发游戏有一个很麻烦的问题——如何来实现VCL中按钮等等控件的效果。以前使用3.10的时候,我使用的方法是:定义出一个区域来,判断鼠标点击的是不是在这个区域,如果是那么做相应的操作。这样虽然也可以实现,但是其代码量和逻辑关系比较难以控制。很是麻烦。

最近使用Asphyre4.10SpriteEngine来开发游戏,觉得将这两个结合起来实现按钮效果非常方便。下面我就将如果实现这种效果写出来。

我使用的Asphyre版本是Asphyre4snapshot这个可以在火人的BLOG上下载([url]http://www.huosoft.com/bbs/ShowPost.asp?ThreadID=20[/url])使用的SpriteEngine也可以在这个页面上下载到。

首先在Delphi2006LIBRARY中加入它们。

然后在自己创建的工程中引入AsphyreSprite, sphyreSpriteEffects,AsphyreSpriteUtils,AsphyreDevices,AsphyreDef,
  AsphyreEffects,AsphyreTimer,AsphyreImages,
  AsphyrePalettes
单元。

 

我们创建一个按钮类

// 按钮类
  TSpriteButton=class(TAnimatedSprite)
  private
  public
     procedure DoMove(const MoveCount: Single); override;
     procedure OnMouseClick; override;
     procedure OnMouseLeave; override;
     procedure OnMouseEnter; override;
     procedure OnMouseUp; override;
  end;

 

并在界面的CREATE事件中加入一下代码:

procedure TSHFrm.FormCreate(Sender: TObject);
begin
  inherited;
  //
加载图片的XML文件

 ImageGroups.ParseLink('/images.xml');

 // 加载字体的XML文件
  FontGroups.ParseLink('/fonts.xml');

 // 初始化Devices
  Devices.InitEvent:=InitDevice;
  Devices.DoneEvent:=DoneDevice;
  Devices.Count:=1;
  if(not Devices.Initialize(DevConfig,Self)) then
  begin
    close();
    Exit;
  end;

 // 初始化Timer
  Timer.Enabled:=true;
  Timer.OnTimer:=TimerEvent;
  Timer.MaxFPS:= 4000;


end;

 

procedure TSHFrm.InitDevice(Sender: TAsphyreDevice);
begin
  inherited;
  SpriteEngine := TSpriteEngine.Create(nil);
  SpriteEngine.Device:=Sender;
  SpriteEngine.Image := Sender.Images;
  SpriteEngine.Canvas := Sender.Canvas;
  SpriteEngine.DoMouseEvent := True;
  //
设置界面的宽和高

  SpriteEngine.VisibleWidth:=1022;
  SpriteEngine.VisibleHeight:=738;

  // 创建系统按钮

  CreateSystemButton;
end;

 

procedure TSHFrm.DevConfig(Sender: TAsphyreDevice; Tag: TObject;
  var Config: TScreenConfig);
begin
  Config.Width   := 1022;
  Config.Height  := 738;
  Config.Windowed:= true;
  Config.VSync   := true;
  Config.BitDepth:= bd24Bit;
  Config.WindowHandle:= Self.Handle;
  Config.HardwareTL  := false;
  Config.DepthStencil:= dsNone;
end;

 

 

procedure TSHFrm.TimerEvent(Sender: TObject);
begin
  Devices[0].Render(0, DevRender, Self, cRGB1(255,255,0));
  Timer.Process();
end;

 

procedure TSHFrm.DevRender(Sender: TAsphyreDevice; Tag: TObject);
begin
  inherited;
  //
绘制背景
  DrawEx(Sender.Canvas,Sender.Images.Image['gameback'], 0, 0, 0, clWhite4, fxuBlend);
  {
绘制用户信息}
  //
自己的信息
  DrawOtherInfo(Sender);
  SpriteEngine.Draw;
  SpriteEngine.Move(1);
end;

 

以上是一些必须写的代码下来看如何来实现最大化,最小化和关闭按钮。

CreateSystemButton函数中创建系统按钮。

procedure TSHFrm.CreateSystemButton;
begin
  //
最小化
  with TSpriteButton.Create(SpriteEngine) do
  begin
    SetAnim('min',0,1,0,false);   //
按钮初始状态使用的图片
    DoAnimate := true;
    Width := 35;           //
按钮的宽
    Height:=22;            //
按钮的高
    X := 912;                //
按钮所在的X位置
    Y := 0;                    //
按钮所在的Y位置
    Tag := 101;            //
按钮的TAG 
  end;

  // 最大化
  with TSpriteButton.Create(SpriteEngine) do
  begin
    SetAnim('max',3,3,0,false);
    DoAnimate := true;
    Width := 35;
    Height:=22;
    X := 947;
    Y := 0;
    Tag := 102;
  end;


  //
关闭
  with TSpriteButton.Create(SpriteEngine) do
  begin
    SetAnim('close',0,1,0,false);
    DoAnimate := true;
    Width := 35;
    Height:=22;
    X := 982;
    Y := 0;
    Tag := 103;
  end;
end;

 

TSpriteButton按钮类的中实现DoMove函数

procedure TSpriteButton.DoMove(const MoveCount: Single);
begin
  inherited;
  ActiveRect:=Rect(Round(X), Round(Y), Round(X+40), Round(Y+40));
end;

 

处理按钮类中鼠标点击等事件

procedure TSpriteButton.OnMouseClick;
begin
  inherited;
  case Self.Tag of
  101:             //
最小化
  begin
    SetAnim('min', 2, 2, 0, false);
  end;
  102:             //
最大化
  begin
    SetAnim('max', 3, 3, 0, false);
  end;
  103:             //
关闭
  begin
    SetAnim('close', 2, 2, 0, false);
    SHFrm.Close;
  end;

  end;
end;

procedure TSpriteButton.OnMouseEnter;
begin
  inherited;
  case Self.Tag of
  101:             //
最小化
  begin
    SetAnim('min', 1, 1, 0, false);
  end;
  102:             //
最大化
  begin
    SetAnim('max', 3, 3, 0, false);
  end;
  103:             //
关闭
  begin
    SetAnim('close', 1, 1, 0, false);
  end;

  end;

end;

procedure TSpriteButton.OnMouseLeave;
begin
  inherited;
  101:             //
最小化
  begin
    SetAnim('min', 0, 0, 0, false);
  end;
  102:             //
最大化
  begin
    SetAnim('max', 3, 3, 0, false);
  end;
  103:             //
关闭
  begin
    SetAnim('close', 0, 0, 0, false);
  end;

  end;
end;

procedure TSpriteButton.OnMouseUp;
begin
  inherited;

  case Self.Tag of
  101:             //
最小化
  begin
    SetAnim('min', 0, 0, 0, false);
  end;
  102:             //
最大化
  begin
    SetAnim('max', 3, 3, 0, false);
  end;
  103:             //
关闭
  begin
    SetAnim('close', 0, 0, 0, false);
  end;

  end;
end;

这样我们就实现了系统按钮的功能。通过以上的代码,大家不难看出对于鼠标事件的处理,主要是依照这个按钮对象的Tag 值。其实以上的方法也可以用来实现图片的移动效果,具体方法我就不在这里写了。
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/60975如需转载请自行联系原作者

fxh7622
相关文章
|
5月前
|
开发者
为什么你的游戏做不出来?
为什么你的游戏做不出来?
37 0
|
3月前
|
机器学习/深度学习
猜谜游戏
【2月更文挑战第4天】猜谜游戏。
24 0
|
5月前
|
小程序
同样的游戏如何做出不一样的体验?
同样的游戏如何做出不一样的体验?
29 0
|
11月前
【游戏开发】游戏概念设计
游戏一直是人们追逐的梦想之一。如今,游戏一步一步地从以前的简单娱乐工具发展为现代娱乐、竞技甚至在某些方面能够模拟现实生活的现代工具。随着技术的不断进步,游戏的品质和数量也在不断提高。
83 0
|
12月前
|
开发者
不要全职去做游戏
嗨!大家好,我是小蚂蚁。 前段时间有两位学员有想要全职做游戏的想法,来问我是否可行,都被我极力的劝阻了。按道理说作为一个教别人做游戏的老师,我应该极力的鼓励学员去全力的做游戏。但是“全力”去做游戏跟“全职”去做游戏完全是两码事,当你在做一件事情的时候,付诸全力一定会得到一个更好的结果。但是如果你要去全职做游戏的话,那结果大概率的是养不活自己。
81 0
|
12月前
|
开发工具 开发者
一些与做游戏有关的你想知道的事
我始终认为做游戏是一项技能,游戏创作者制作一个游戏,跟写作者写一篇文章,吉他手弹一首乐曲,糕点师做一个松软的面包,木匠做一套精美的家具都是一样的。对于掌握一项技能来讲,只有一件最重要的事,就是熟练。所以,想学好做游戏唯有不停的练习直至熟练,除此之外,其它的都是弯路。
81 0
|
12月前
|
开发者
什么才是“好游戏“?
什么样的游戏才算是一个好游戏呢?其实这是一个很私人的问题,不应该被拿出来当众讨论,就像什么样的电影才是好电影?什么样的书才是好书?什么样的生活才是好生活?什么样的人生才是好人生?...... 这些问题都有着共同的特点,就是因人而异。每个人都有着自己的经历和想法,所以对应的每个问题也都有着自己的答案。
87 0
|
12月前
|
开发工具 Android开发 图形学
微信小游戏是个人尝试做游戏最好的选择
我自己现在正在做微信小游戏,而且也在教很多的学员做微信小游戏。你可能会觉得我这样说是有一定的动机的,但其实不然,如果我自己不相信这个平台的话,那其实我是没有必要自己做的,只需要忽悠让别人相信就可以了。但是现在我自己也正在致力于做这件事,这也证明了我对它的认可。不是有这么一句话吗?不要轻易相信一个人说了什么,而要看他做了什么
100 0
|
12月前
在游戏中实现飘花和落叶效果
嗨!大家好,我是小蚂蚁。 今天这篇文章分享一下如何在游戏中实现飘花和落叶的效果,在游戏背景中加入它们,能够让你的游戏更加的栩栩如生。 之前我们讲过如何在游戏中实现一场雨,主要利用的随机性,一系列的随机处理模拟出了下雨的效果,对于飘花和落叶同样也需要各种各样的随机处理。
61 0
简单的HANGMAN游戏
分析一下简单的hangman游戏,hangman主要两个窗口就是菜单窗口和游戏窗口。这里要用面板以及布局方式将元件排列好,有个基本雏形,这是第一步。这里第一个页面用到girdbaglayout布局方式,这种布局方式感觉效率很高,排布的也很美观,需要注意的是要使用时添加一行“特殊”的代码,后面的添加方式跟边界布局有一点点小类似。
243 0
简单的HANGMAN游戏