Feeding Frenzy完成后的经验总结

            <Feeding Frenzy>(吞噬鱼)从817号开始,到827号结束,我用了一周时间来完整这个DEMO。引擎用的是HGE,本来开始还是象以往一样使用自己写的那个简单引擎的,但是当我得到这个游戏的美术资源时,我发觉我需要处理一些图象的翻转与缩放的问题。DirectX8当然可以做到,但是有那么点复杂,我不想去复习DX的相关知识,尤其是我这里做的还是个2D游戏。

            于是我决定采用HGE引擎,学习这个引擎的用法只花了一天的时间。HGE封装的不错,基本上把DX8用于2DAPI封装起来了-----我个人觉得除了那个quad,因为quad同样有顶点的概念。

            HGE也算是Facade模式的一种应用体现。

           现在把做这个项目的一些体验总结出来:

           1。大体开发步骤与以往不是很相同。

               以往的方式是:先尽可能地把问题描述出来,然后从问题中抽象出类,然后抽象出类的行为,然后抽象出类的属性,与此同时可以适当地描述类对象,最后便可以考虑具体编码了。

              我个人觉得,采用这种方法有个弊端, 那就是忽略了系统的逻辑性----用面向过程中的术语说,那就是程序流程。我记的以前在做《是男人就下一百层》时,还特地写了段描述游戏主循环的流程,而在Magic girl里,我没有描述流程,直到开始编写主循环时,我发觉我忽略了很多细节地方,如果我在原来设计的系统基础上去添加那些细节,代码将变的异常恶心。于是,我放弃了那个项目。

Feeding Frenzy 的大致开发步骤变为:描述问题-----à设计整个系统的类关系图,也就是大致有哪些类,类之间的关系是什么---à我特地画了张游戏主循环的流程图----------à然后我写了个classInfo.h头文件,把主要的几个类的大致接口用代码的形式描述出来,这里肯定会参照之前做的准备工作,包括那张类图和那张主循环流程图------à经过以上的思考过程,这个时候我改写了之前那长主循环流程图,我在那张图上的每一步都加上了具体对象的方法调用,经过了这一步骤后,整个系统的核心部分基本就可以确立下来了,这可以保证在具体编码时不会出现严重的逻辑疏忽。---------à仔细检查上一步骤改过的图,确保没有严重的逻辑疏忽,这个时候会检查出在描述问题的文档中有疏漏的地方,修改那分文档,供以后参考。------à具体编码。

 2.关于CRender在系统中的地位。

   CRender象以往一样拥有很多渲染方法,它们基本包括了游戏里所有的渲染。在我以往的作品中,我会让Cgame这个主要的逻辑类,或者叫调度类,来显示调用 CRender的对应函数来渲染场景。但是我一直觉得这样的OO设计方法不是很好。反问一句:为什么精灵不能自己绘制自己?

  于是,这次我象Magic Girl里那样,把一个CRender的指针传给所有渲染对象,但是实际的渲染代码还是放在CRender 里,然后精灵就拥有一个Render函数供外部调用,Render函数实际调用的是CRender对象的函数来渲染自己。

3.关于CspriteContainer类。

     游戏中的所有精灵都派生于CSprite基类,我为了不使系统中出现CSprite直接定义出来的对象,我给CSprite添加了一个纯虚函数:Render。事实上,CSprite又派生于CspriteAnim这个类---那是个控制精灵动画播放的类,这个类采用了方向与动作的方式来控制精灵的动画帧切换,我觉得它很方便。

  正因为所有精灵都派生于CSprite,所以我可以利用多态很轻松地操作所有的精灵。另外,因为我肯定需要个链表(或者顺序表)来存储所有的怪物鱼。事实上,我把游戏里所有的非玩家精灵都存储在这个链表里,但是为了针对不同的精灵采取不同的动作,我又给每个精灵加了个类型属性,这用来标示精灵到底是鱼还是其他宝物什么的。

为了把链表操作与Cgame独立出来,我便加入了CspriteContainer这个类。它实际上就是个链表操作类。有了这个类后,Cgame里的逻辑就变的更为清晰。

4.关于GUI设计。

HGE引擎本身其实包含了GUI的处理,但是在这个游戏里,我还是自己写了GUI。这个GUI了,我主要写了Cbutton,以及Cdialog,相较而言,Cbutton的通用性更强。它的设计其实很简单,当我写了一半的时候,我突然发觉它和CspriteAnim如此相象。于是,在我自己设计的Cbutton里,也有用状态来决定动画帧的概念。

通常情况下,Cbutton 都包含几幅纹理图象的句柄,我要让它完全能够自己绘制自己,因此在构造它时,就需要传入一个DrawMgr对象。

Cdialog类的设计,开始我是想直接把按钮之类的创建放到对话框里,可是后来发现,那样做一点通用性都没有。于是我采用了Qt这个GUI开发包的方法,我把按钮之类的控件的创建放到对话框类的代码之外,它们由使用Cdialog的客户自己手工创建,然后把指针传到给对话框保存起来,供对话框操作用。

预计有时间了再专门设计一套GUI

        

         5.关于CSpriteAnim类。

         这个类是我之前就写好的,以前也写了个控制精灵动画的类,但是后来发现没有写好,原因是因为那个类只是单纯地处理帧之间的切换,而事实上很多精灵动画并不只是所有帧循环切换来表现的。在新的这个类中,也就是CspriteAnim中,我加入了状态的概念,一个状态包括精灵的方向和精灵的动作,例如一条鱼动画,当鱼正在向左边游动时,其状态就由“向左”和“游动”两个状态信息构成。

         这个类可以处理大量的精灵动画,实在很好用。另外要说明的是,这个类是我在看了张勇的《Super Mario》的代码后产生灵感写成的。

 

         6.关于碰撞检测。

         游戏中由于涉及到精灵的扩大与缩小,又加之于在绘制精灵时其坐标代表的是其图片的左上角绘制出来的坐标真正的图象在右下角点。

         HGE引擎设置的hotspot影响了缩放的坐标变化,Anchor point is the center for scaling, rotation and position operations。当hotspot为(0,0) 时,无论是放大还是缩小,其左上角始终在Render( x, y ..处。

     因此,游戏中的碰撞检测其实不是很准确。在Gameres上发布的版本我没解决这个问题。

 

        Feeding Frenzy下载地址:http://show.gameres.com/FeedingFrenzy/FeedingFrenzy.rar

你可能感兴趣的:(Feeding Frenzy完成后的经验总结)