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

想要实现很炫的棋牌类游戏的效果,一定要用很好的开发工具。 DELPHIX 自然是很不错的选择,但是使用起来比较麻烦。而使用 Asphyre 来开发则会方便很多
下面我们来探讨一下如何使用 Asphyre3.10 开发棋牌类游戏的客户端、以及如何实现粒子效果的问题。
1 :使用 Asphyre 开发游戏。
安装 Asphyre
Asphyre3.10 可以安装在 DELPHI7 下。和其它的第三方控件一样,安装完成后可以在组件栏里显示出
安装好 Asphyre 后,我们就可以利用它来开发游戏了。
首先我们创建一个项目,并在窗体上放上 Asphyre 组件 TAsphyreDevice MyDevice )、 AsphyreTimer MyTimer )、 TAsphyreCanvas MyCanvas )、 TAsphyreImages MyImages )、 TASDb MyASDB )。
然后我们设置组件 MyASDB 的属性。我在这里设置成 My.asdb 。文件 My.asdb 是一个资源文件,它包含了所有游戏中使用到的图片。这个资源包可以使用 Asphyre 自带的工具 AsphyreManager 来编辑。具体的编辑方法我后面会讲到。
设置好 MyASDB 的属性后我们就可以开始编程了。
 
Form Create 中写入初始化代码:
  if (not MyDevice.Initialize()) then
  begin
   Close();
   Exit;
  end;
MyDevice OnInitialize 事件中写入代码:
 Success:=MyImages.LoadFromASDb(MyASDB);
 MyTimer.Enabled:= Success;
这两行代码的意思是将资源文件加载进 MyImages 中,并启动组件 MyTimer
MyTimer 的事件 OnTimer 中写入绘制背景代码
MyDevice.Render(0, True);
MyDevice.Flip();
在组件 MyDevice OnRender 事件中开始绘制游戏界面中的各项信息。
MyCanvas.Draw(MyImages.Image['Gameback.image'], 0, 0, 0, fxBlend);
Draw 函数说明:
MyImages.Image['Gameback.image'] 是需要绘制的图片名称。此名称必须和 ASDB 文件中的文件名称一致。
后面两个 0 0 指的是绘制的实际坐标。
对于第 3 0 说明我们使用 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;
 
然后在在组件 MyDevice OnRender 事件中绘制相关的最大化状态图
MyCanvas.Draw(MyImages.Image['Max.image'], 0, 0, MaxButStatus, fxBlend);
 
Asphyre 是不停的在使用 MyCanvas.Draw 来刷新窗体的。所以如果我们将 Label 组件放在窗体上是不会看到的。但是像 Button Image ListView 这类组件是不会被 Asphyre 覆盖的。所以我们在开发游戏的时候可以尽可能的使用 Asphyre 和组件结合的办法。  
接下来我们探讨一下 AsphyreManager 的使用方法,以及函数 MyCanvas.Draw 中的倒数第二个参数的用法。
以下是 AsphyreManager 的运行界面。
 
点击 选择需要加载的资源图片。
 
一般我们会将最大化按钮的几种状态做在一张图上。在 Pattern Size 中输入每一张图的大小。
并点击 ADD
那如何在游戏中调用图片中的相应状态呢?
调用相应的状态就是靠着 MyCanvas.Draw 函数的倒数第二个状态来确定的。第一个状态图为 0 ,依次类推。
2 :在游戏中实现粒子效果。
有的时候我们会看到有些游戏会在胜利的时候放出礼花的效果。这些都是使用了粒子效果来实现的,以下是我使用粒子实现的一个效果。
 
要实现粒子效果首先需要加入粒子效果的单元文件: XParticles_Unit Xparticles SmoothColorUnit
 
定义一个粒子对象结构:
// 显示开始特效
  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) :在 MyDevice OnRender 事件中加入 m_Bomb.PMgr.Render;
(4) MyTimer On Process 事件中加入 m_Bomb.PMgr.Update(Delta);
这样粒子效果就已经实现了,当需要显示粒子的时候调用:
m_Bomb.PSys:= m_Bomb.PMgr.SpawnPS(m_Bomb.PSS, MyImages.Image['bomb.image'],460,300);
就可以了。
 
通过以上 3 篇文章,我们大致的讨论了一下编写棋牌类游戏所需要的基础知识。从下一篇开始,将讨论棋牌类游戏的设计部分。一个好的游戏框架设计会对以后的开发和扩展带来很大的好处。

你可能感兴趣的:(游戏,职场,休闲,棋牌类游戏)