想要实现很炫的棋牌类游戏的效果,一定要用很好的开发工具。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;
begin
Close();
Exit;
end;
在MyDevice的OnInitialize事件中写入代码:
Success:=MyImages.LoadFromASDb(MyASDB);
MyTimer.Enabled:= Success;
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篇文章,我们大致的讨论了一下编写棋牌类游戏所需要的基础知识。从下一篇开始,将讨论棋牌类游戏的设计部分。一个好的游戏框架设计会对以后的开发和扩展带来很大的好处。
本文转自狗窝博客51CTO博客,原文链接http://blog.51cto.com/fxh7622/70623如需转载请自行联系原作者
fxh7622