首先我得先说明:我这里所谓的OO感受是很肤浅的,我没有做过大的项目,更没有过软件维护的感受。事实上我比较期待我能有一次做大项目的经历,也许那对于面向对象思维方式的建立会更为有利!
2月份底的时候我开始做一个自己认为比较完整的游戏,它是一个类似《雷电》的游戏,我会往里面加入尽可能多的元素。可是后来当游戏里的对象越来越多的时候,整个工程开始变的举步唯艰。我立刻意识到,越来越难的设计,代码架构开始期待更好的设计方法!
以前我的游戏程序里会有那么一点点我所谓的面向对象的影子,游戏程序里面的类看上去似乎没有重用的价值-----除非你的另一个游戏里会有类似的对象!----呵呵,相同的题材会很乏味!-----我只设计类,一个单单的类,没有继承,没有多态,甚至没有重载。现在审视一下,类之间的耦合度也很高(甚至在一些早的东西里,图象处理部分和游戏逻辑部分都放在一起)!---可谓是一堆垃圾代码!
当我意识到这一点时,我开始继续深入地学习C++,与此同时,我还开始了另一个学习科目---MFC。在学MFC的同时,你知道,那里面就是一大堆一大堆的虚拟函数,多态机制,然后我就总结了我的《对于多态性的学习总结---虚函数的有与没有》。
看了越来越多的C++和OO之后------我甚至接触到了UML-----我渐渐地有了那么点心得。“用看待世界的方法去编写程序,认识世界就是在编程”。那会是多么美妙!
然后我大致看了《C++编程经典》中的一个电梯案例---那是一个绵延几章的例子,看的我郁闷不已。初步有了点具体的认识,然后就开始我的这个模拟程序:模拟飞机射击类游戏!
我尽量改变自己的思维方式。我想,我获得了一些效果!
看一下以下的文档:
//
2006.3.14
最近接触面向对象技术比较频繁,有了点心得,决定把这种心得或者说
是一种思想运用一下.
这是一个飞机射击游戏程序.我将尽可能地用对象来描绘这个游戏.
(如果分析了<C++编程经典>的话,我想要我来构建这个程序会更容易更理论化.)
1.攥写问题描述:
这是一个飞机射击类游戏的模拟程序。游戏中有一个玩家飞机,和许多玩家飞机产生的子弹
还有许多敌人飞机,和许多敌人飞机产生的子弹。玩家飞机接收玩家输入,从而使玩家飞机
产生相应的动作,例如移动和发射子弹。敌人飞机又游戏本身随机产生。玩家飞机和敌人飞机
都会产生很多子弹。玩家飞机的子弹攻击到敌人,则对应的敌人就消失;而当敌人飞机的子弹攻击
到玩家飞机,或者敌人飞机撞到玩家飞机时,玩家飞机死亡。(为了简化问题,假设游戏中玩家只有一次生命--即玩家一被敌
人子弹攻击游戏就结束---这也会是这个程序结束的时候)。
由于是模拟程序,因此程序里会有个模拟器,它是用来模拟玩家输入的---当然结果就是随机的--
2.标识系统中的类:
一个玩家飞机类,敌人飞机类,玩家子弹类,敌人子弹类,模拟类,由这一切组成的游戏类.
3.标识对象:
一个玩家飞机对象,许多敌人飞机对象,许多玩家子弹对象,许多敌人子弹对象,
一个模拟器对象,一个游戏对象.
4.标识类属性:
玩家飞机对象:坐标,当前运动状态(向哪个方向移动,是否发射子弹),当前生命状态,X速度,Y速度
敌人飞机:坐标,当前运动状态(向哪个方向移动,是否发射子弹),当前生命状态,X速度,Y速度
(二者不同的地方在于,玩家飞机的运动状态是由玩家来决定的,而敌人飞机运动状态是
其自己决定的)
玩家子弹:坐标,生命状态(是否消失),Y速度
敌人子弹:坐标,生命状态(是否消失),Y速度
模拟类:随机产生的键值-----只用来模拟玩家输入
游戏类:状态(开始,结束),拥有的各种对象
5.标识类行为:
玩家飞机:移动,接收玩家输入,画自己,发射子弹,
敌人飞机:移动,画自己,发射子弹
玩家子弹:移动,画自己,检测是否击中敌人
敌人子弹:移动,画自己,检测是否击中玩家
模拟类:产生键值
游戏类:调度游戏各个对象的运作,
6.类层次:
一个基类CObject,二级派生类CPlane,CBullet,三级派生类CPlayerPlane,CEnemyPlane
,CPlayerBullet,CEnemyBullet
模拟类
游戏类,由CPlayerPlane,CPlayerBullet,CEnemyPlane,CEnemyBullet,CModel类构成.
2006.3.16
感觉上这次的模拟程序,难点在写代码前的设计上,一旦确定了设计,
编码就不难了。
2006.3.16
21:29
已测试完成敌人飞机类和玩家类,不打算把子弹类做出来了!主要目的就是想利用这个
模拟项目锻炼一下自己这几天的成果。
基本上,我就觉得,困难的部分在于攥写文档,尤其是描述类与类之间的交互时,比较复杂。编码的时候只要对照着文档,就没有多大难度了。
PS:2006.3.19
基于自身的倔强,昨天我又把2月底的那个项目拣回来了.要做下去,要做完,要做出来,信念强烈!
我按照我刚学到的OOD步骤,从攥写问题描述文档,到建模各个类,一一去做.当我在描述各个类的行为时,我竟然很自然地描述道:玩家飞机类:移动,接受玩家输入,能够通知游戏类对象创造玩家子弹对象,能够告诉游戏类对象怎样来画自己(然后游戏类对象告诉渲染器对象怎样画它.....
这不就是一种OO思维吗?这些实体对象,他们在现实世界里就是这样做的----放到程序里面去,我依然用代码去描绘他们的这种特性!
这真是棒极了!在接下来的攥写描述文档中,我变的越来越OO,我真的觉得自己仿佛不是在写程序,而是-----在讲一个故事,故事里的每个角色是怎样来和其他角色交互的!
到现在为止,这个程序已经完成了大半了!所有零件已经制造出来,剩下的,就是用游戏类对象(程序里定义的对象)把这些零件连接在一起.------真的很象电脑里的主板,我把那些零件安装在上面,然后这个"主板"还要去让所有"配件"互相通信!各个"配件"就是靠这块"主板"来共同工作,从而构成一台性能强劲的PC!我让所有的"配件"与"配件"之间的联系消失了!这个"配件"要与另一块"配件"通信,好,拜托,请先通知"主板","主板"会帮你转述你的请求!
这真的是太美妙了!
现在我看到我的上一个游戏项目的代码,觉得粗糙无比,跟垃圾一般.哈哈,我真的是在进步!