使用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
相关文章
|
7月前
|
开发者
为什么你的游戏做不出来?
为什么你的游戏做不出来?
61 0
|
2月前
|
机器学习/深度学习
猜谜游戏
【10月更文挑战第16天】猜谜游戏。
67 6
|
7月前
如何在游戏中实现飘花和落叶效果?
如何在游戏中实现飘花和落叶效果?
75 1
|
安全 搜索推荐 UED
利用娱乐游戏源码来打造游戏直播平台步骤
直播技术的不断发展,娱乐游戏直播平台吸引了大量游戏爱好者观看。近年来,东莞梦幻网络科技推出的“娱乐游戏直播”的成品源码,使许多企业能够轻松快速地搭建完整的游戏直播平台。下面将介绍如何利用该源码来打造游戏直播平台:
【游戏开发】游戏概念设计
游戏一直是人们追逐的梦想之一。如今,游戏一步一步地从以前的简单娱乐工具发展为现代娱乐、竞技甚至在某些方面能够模拟现实生活的现代工具。随着技术的不断进步,游戏的品质和数量也在不断提高。
|
开发者
什么才是“好游戏“?
什么样的游戏才算是一个好游戏呢?其实这是一个很私人的问题,不应该被拿出来当众讨论,就像什么样的电影才是好电影?什么样的书才是好书?什么样的生活才是好生活?什么样的人生才是好人生?...... 这些问题都有着共同的特点,就是因人而异。每个人都有着自己的经历和想法,所以对应的每个问题也都有着自己的答案。
132 0
|
开发者
不要全职去做游戏
嗨!大家好,我是小蚂蚁。 前段时间有两位学员有想要全职做游戏的想法,来问我是否可行,都被我极力的劝阻了。按道理说作为一个教别人做游戏的老师,我应该极力的鼓励学员去全力的做游戏。但是“全力”去做游戏跟“全职”去做游戏完全是两码事,当你在做一件事情的时候,付诸全力一定会得到一个更好的结果。但是如果你要去全职做游戏的话,那结果大概率的是养不活自己。
113 0
|
开发工具
为什么不要通过去找游戏源码的方式来做游戏
一个来自游戏开发新手朋友的问题: 蚂蚁老师,我从小就很喜欢玩游戏,玩得多了渐渐就有一些自己的想法,没事无聊的时候就会把这些想法写下来,写得多了就有自己做游戏的想法,因为自己什么都不会,所以一直都没能付诸行动,直到有天在抖音刷到您的教学视频,又燃起我做游戏的热情。现在我最想做的是一款类似《植物大战僵尸》类的休闲塔防游戏。
242 0
|
C++
201712-2 游戏
201712-2 游戏
97 0
201712-2 游戏
|
开发者
游戏中一些常用的“行话”
每个领域都有一些属于自己的“行话”,游戏领域也不例外。这些“行话”对于了解游戏开发的人来说是日常用语,但是,对于非游戏行业的人来说其可能完全是不知所云。所以,在此你需要了解一些“行话”的含义,以便于在接下来的内容中,你能够清楚我所表达的是什么。无需担心,我们只是了解几个必要的概念,而且,它们都很容易理解。
556 0
游戏中一些常用的“行话”
下一篇
DataWorks