使用Delphi编写棋牌类游戏 -- 基础篇(3)

想要实现很炫的棋牌类游戏的效果,一定要用很好的开发工具。DELPHIX自然是很不错的选择,但是使用起来比较麻烦。而使用Asphyre来开发则会方便很多
下面我们来探讨一下如何使用Asphyre3.10开发棋牌类游戏的客户端、以及如何实现粒子效果的问题。
1:使用Asphyre开发游戏。
安装Asphyre
Asphyre3.10可以安装在DELPHI7下。和其它的第三方控件一样,安装完成后可以在组件栏里显示出
使用Delphi编写棋牌类游戏 -- 基础篇(3)
安装好Asphyre后,我们就可以利用它来开发游戏了。
首先我们创建一个项目,并在窗体上放上Asphyre组件TAsphyreDevice使用Delphi编写棋牌类游戏 -- 基础篇(3)MyDevice)、AsphyreTimer使用Delphi编写棋牌类游戏 -- 基础篇(3)MyTimer)、TAsphyreCanvas使用Delphi编写棋牌类游戏 -- 基础篇(3)MyCanvas)、TAsphyreImages使用Delphi编写棋牌类游戏 -- 基础篇(3)MyImages)、TASDb使用Delphi编写棋牌类游戏 -- 基础篇(3)MyASDB)。
然后我们设置组件MyASDB的属性。我在这里设置成My.asdb。文件My.asdb是一个资源文件,它包含了所有游戏中使用到的图片。这个资源包可以使用Asphyre自带的工具AsphyreManager来编辑。具体的编辑方法我后面会讲到。
设置好MyASDB的属性后我们就可以开始编程了。
 
FormCreate中写入初始化代码:
  if (not MyDevice.Initialize()) then
  begin
   Close();
   Exit;
  end;
MyDeviceOnInitialize事件中写入代码:
 Success:=MyImages.LoadFromASDb(MyASDB);
 MyTimer.Enabled:= Success;
这两行代码的意思是将资源文件加载进MyImages中,并启动组件MyTimer
MyTimer的事件OnTimer中写入绘制背景代码
MyDevice.Render(0, True);
MyDevice.Flip();
在组件MyDeviceOnRender事件中开始绘制游戏界面中的各项信息。
MyCanvas.Draw(MyImages.Image['Gameback.image'], 0, 0, 0, fxBlend);
Draw函数说明:
MyImages.Image['Gameback.image']是需要绘制的图片名称。此名称必须和ASDB文件中的文件名称一致。
后面两个00指的是绘制的实际坐标。
对于第30说明我们使用Gameback.image图片中的第几个图片,我会在后面结合AsphyreManager的使用来说明。
通过以上的代码我们可以将一个背景图绘制在窗体上。
那我们应该如何绘制一个按钮呢?
使用Asphyre来绘制一个按钮是一件比较麻烦的事情。
首先我们需要定义这个按钮的绘制区域,例如:
//最大化区域
MaxRect:TRect=(Left:722;Top:2;Right:756;Bottom:24);
然后定义一个变量来记录显示按钮的状态。
MaxButStatus:Integer;   //最大化按钮状态
其次就是我们对用户点击区域的处理了。
在界面的OnMouseDown事件中判断用户是否按下了最大化区域。
IF 按下的是最大化按钮区域 THEN
BEGIN
  MaxButStatus:=2;
END;
在窗体的OnMouseUp事件中判断用户是否放开了最大化按钮区域
IF 鼠标抬起的是最大化按钮区域 THEN
BEGIN
  MaxButStatus:=0;
END;
在窗体的OnMouseMove事件中判断用户是否用鼠标划过最大化按钮区域
IF 鼠标划过的是最大化按钮区域 THEN
BEGIN
  MaxButStatus:=1;
END;
 
然后在在组件MyDeviceOnRender事件中绘制相关的最大化状态图
MyCanvas.Draw(MyImages.Image['Max.image'], 0, 0, MaxButStatus, fxBlend);
 
Asphyre是不停的在使用MyCanvas.Draw来刷新窗体的。所以如果我们将Label组件放在窗体上是不会看到的。但是像ButtonImageListView这类组件是不会被Asphyre覆盖的。所以我们在开发游戏的时候可以尽可能的使用Asphyre和组件结合的办法。 
接下来我们探讨一下AsphyreManager的使用方法,以及函数MyCanvas.Draw中的倒数第二个参数的用法。
以下是AsphyreManager的运行界面。
 
使用Delphi编写棋牌类游戏 -- 基础篇(3)
点击使用Delphi编写棋牌类游戏 -- 基础篇(3)选择需要加载的资源图片。
使用Delphi编写棋牌类游戏 -- 基础篇(3)
 
一般我们会将最大化按钮的几种状态做在一张图上。在Pattern Size中输入每一张图的大小。
并点击ADD
使用Delphi编写棋牌类游戏 -- 基础篇(3)
那如何在游戏中调用图片中的相应状态呢?
调用相应的状态就是靠着MyCanvas.Draw函数的倒数第二个状态来确定的。第一个状态图为0,依次类推。
2:在游戏中实现粒子效果。
有的时候我们会看到有些游戏会在胜利的时候放出礼花的效果。这些都是使用了粒子效果来实现的,以下是我使用粒子实现的一个效果。
 
使用Delphi编写棋牌类游戏 -- 基础篇(3)
要实现粒子效果首先需要加入粒子效果的单元文件:XParticles_UnitXparticlesSmoothColorUnit
 
定义一个粒子对象结构:
//显示开始特效
  RPropSetInfo = record
    PSS:  TXParticleSystemSettings;
    PMgr: TXParticleManager;
    PSys: TXParticleSystem;
  end;
 
(1):在主界面的public中定义粒子结构的对象m_Bomb:RPropSetInfo;并定义全局变量Delta: integer = 0;
(2):在主界面的OnCreate事件中加入对粒子对象的初始化代码:
m_Bomb.PMgr:=TXParticleManager.Create();
  m_Bomb.PMgr.Canvas:= MyDevice;
  if (not ASDb.ReadStream('BOMB.pss', Stream)) then
  begin
    ShowMessage('Unable to load ParticleSystem settings');
  end;
  Stream.Position:= 0;
  Stream.Read(m_Bomb.Pss, SizeOf(TXParticleSystemSettings));
  Stream.Free();
其中BOMB.pss是我们使用粒子效果编辑器编辑的文件。
(3):在MyDeviceOnRender事件中加入m_Bomb.PMgr.Render;
(4)MyTimerOn Process事件中加入m_Bomb.PMgr.Update(Delta);
这样粒子效果就已经实现了,当需要显示粒子的时候调用:
m_Bomb.PSys:= m_Bomb.PMgr.SpawnPS(m_Bomb.PSS, MyImages.Image['bomb.image'],460,300);
就可以了。
 
通过以上3篇文章,我们大致的讨论了一下编写棋牌类游戏所需要的基础知识。从下一篇开始,将讨论棋牌类游戏的设计部分。一个好的游戏框架设计会对以后的开发和扩展带来很大的好处。
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/70623如需转载请自行联系原作者

fxh7622
上一篇:吴恩达《构建机器学习项目》精炼笔记(2)-- 机器学习策略(下)


下一篇:使用Delphi编写棋牌类游戏 – 设计篇(3)