改写《魔塔》中篇01:重构代码之分离场景和图层
2013-03-31 05:46
423 查看
写在前面:中期阶段我们只是按照书上的方式来介绍重构代码的过程,由于版本等原因,粘贴出来的代码已经不符合我们的需要。所以具体改动的代码以中期阶段项目里面的源码文件为准,项目源码下载请移步《改写《魔塔》中篇06:善后工作和注意事项(附:中期阶段项目下载)》。还有我们对原书中的项目进行了一些改动,包括用CCArray替换了CCMutableArray,增加了用于勇士初始化的getSpriteFrame方法等,因此,大家要注意项目源码改动的地方,并且留意文档注释。
到目前为止,我们头疼地发现所有方法都是在同一个类(HelloWorldScene)里实现的。随着新功能的增加,代码变得异常臃肿,阅读和修改也变得越发困难。为了以后的可持续发展,让我们果断暂停新功能的开发,开始对老代码进行重构。
首先我们对HelloWorldScene既包含了场景(CCScene)又包含了层(CCLayer)的做法表示不满:从名字来看,它是个场景(CCScene),可层(CCLayer)部分它也包含进去了。于是干脆将它分离成两个类:GameScene和GameLayer。
GameScene类继承于CCScene,主要负责游戏主场景的创建,它可以与以后游戏中各种场景进行切换,比如主菜单场景。同时,它负责创建游戏主场景内的各个CCLayer,包括地图层,控制按钮层,对话框层和特效层等。
GameLayer继承CCLayer,负责绘制游戏主界面的内容,包括地图,勇士和战斗效果等。
好了,现在来创建GameScene和GameLayer这两个类。
在这之前,首先创建一个公用文件MTGame.h,里面包含了项目中需要公用的类的头文件。这样做的好处是管理方便,所有头文件一目了然。缺点是你修改某个类的定义的时候,会引起其他所有类的重新编译。对于我们目前的游戏来说,这点牺牲还是值得的。如果你的游戏复杂到了一定程度,编译需要很长时间,那么还是老老实实地分别管理头文件比较好。言归正传,MTGame.h文件如下:
#ifndef __MTGAME_H__ #define __MTGAME_H__ #include "cocos2d.h" #include "GameLayer.h" #include "GameScene.h" #endif
GameScene中需要提供一个静态方法showGameScene,用来生成一个新的游戏主界面实例,头文件代码如下:
#ifndef __GAME_SCENE_H__ #define __GAME_SCENE_H__ //包含公用头文件 #include "MTGame.h" //使用cocos2d命名空间 using namespace cocos2d; //GameScene继承CCScene class GameScene : public CCScene { public: GameScene(void); ~GameScene(void); //静态方法用于创建新的游戏主界面的实例 static CCScene* playNewGame(); //初始化函数 virtual bool init(); //Scene的静态创建方法(2.0以后有所变化) CREATE_FUNC(GameScene) }; #endif
GameScene的代码文件(cpp)如下,首先会使用CCScene的create方法创建一个实例,然后调用GameLayer的create方法创建layer的实例,并将其加入到scene当中:
#include "GameScene.h" GameScene::GameScene(void) { } GameScene::~GameScene(void) { } bool GameScene::init() { //新建一个GameLayer实例 GameLayer* gamelayer=GameLayer::create(); //将GameLayer实例添加到场景中 this->addChild(gamelayer,kGameLayer,kGameLayer); //新建一个ControlLayer实例 ControlLayer* controlLayer=ControllerLayer::create(); //将ControlLayer实例添加到场景中 this->addChild(controlLayer,kControlLayer,kControlLayer); return true; } CCScene* GameScene::playNewGame() { GameScene* scene=NULL; do { scene=GameScene::create(); CC_BREAK_IF(! scene); }while(0); return scene; }
一定会有许多错误提示,那是因为一些变量或者方法并没有定义,不急,我们会在后面进行定义和添加。
对于GameLayer类,我们先把原来HelloWorldScene.cpp中HelloWorld类中相关的代码复制出来,重命名为GameLayer即可。继续修改AppDelegate中创建场景的部分:
// create a scene. it's an autorelease object CCScene *pScene = GameScene::playNewGame(); // run pDirector->runWithScene(pScene);
当然,别忘了包含头文件“ #include "GameScene.h" ”。
相关文章推荐
- 改写《魔塔》中篇02:重构代码之分离游戏地图类
- 改写《魔塔》中篇03:重构代码之分离勇士类
- 改写《魔塔》中篇04:重构代码之单例类
- 改写《魔塔》中篇05:重构代码之控制层
- rails代码重构之 视图层的渲染问题
- 改写《魔塔》前篇05:场景滚动
- TYPagerController 简单,强大,高度定制,页面控制器,水平滚动内容和标题栏,包含多种barStyle。 TYPagerController v2.0 重构优化代码,分离出TYPager
- SceneKit一个3D场景角色的代码重构
- SceneKit一个3D场景角色的代码重构
- SceneKit一个3D场景角色的代码重构
- FieldCache在lucene中使用的代码解析,使用场景个人分析
- 读书笔记之《重构-改善既有代码的设计》第一章
- ASP.Net中程序构架与程序代码的分离
- 关于代码重构
- 写了一段从图像中分离人物和背景的代码,本来想写成智能定位Breast的,可是时间不够,公司游戏开发任务太紧了。先发一段吧···以后有空再补上
- 重构代码 02 构建方法
- 重构你的代码(js)
- 如何将界面代码和功能代码分离(基于Delphi/VCL)
- eclipse 重构代码自动抽取函数