cocos2d里面如何实现MVC(三)
引子:前面两篇文章介绍了一些关于在cocos2d里面如何实现mvc的理论知识,接下来的这三篇教程,我将用一个简单的教程示例,给大家演示一下具体代码实现细节。
?
? ? 这篇文章的写作目的就是让大家更好地理解如何在cocos2d里面实践mvc模式(当然,这里演示的不一定是标准的mvc,因为cocos2d特殊的编程方式。但是,这并不妨碍我们编写更好的代码,你们说对吧?),本文是基于前两篇文章的,所以,在继续阅读之前,我强烈建议你先读一下第一篇的理论介绍。
? ? 我们将制作一个简单的面板解谜游戏(board puzzle game),当然,我们不是简单地开发一个游戏,而是要利用mvc开发出一个简单的“游戏框架”,而且这个框架将会在我的新游戏里面使用到,它具有如下一些特性:
来自?wikipedia:
? ? model负责管理应用领域的数据和行为逻辑,同时负责响应对自己的状态数据请求(这些请求通常是从view过来的),然后响应一些指令来更改自身的状态(这些请求通常是来自controller的)。在一个事件驱动的系统中,model会通知订阅者(observers)(通常是views)它的状态改变,这样view就可以做相应的显示更新。
? ? view则根据model的状态来合理地显示,通常是一些UI元素。一个model可以对应多个view,比如,同一数据的柱状图、饼状条、曲线图等。
? ?controller负责接收多用户输入和调用model的一些方法。一个controller通过从用户那里获得输入,然后操作model对象,最后,model通知view来更新显示。
? ?从维基百科的定义中,我们可以识别出以下几个主要的类(我们会在后面把model给加上去):
? ? 在XCode4里面基于cocos2d的默认模板创建一个新的项目之后,我们又创建了下面这些Groups:
? ? 接下来,我们开始实现GameBoardView。首先,我们把GameBoardView继承至CCNode。
@interface GameBoardView : CCNode {}?
- (id)init { if ((self = [super init])) { // create and initialize a Label CCLabelTTF *label = [CCLabelTTF labelWithString:@"Hello World from view" fontName:@"Marker Felt" fontSize:48]; // ask director the the window size CGSize size = [[CCDirector sharedDirector] winSize]; // position the label on the center of the screen label.position = ccp( size.width /2 , size.height/2 ); // add the label as a child to this Layer [self addChild: label]; } return self;}?
GameBoardController负责初始化view,所以它里面包含了一个GameBoardView的引用,将来就可以非常方便地直接使用了。
@interface GameBoardController : CCNode { GameBoardView *view;}
?因为我们的GameBoardController继承到CCNode,所以,我们可以把GameBoardView当作GameBoardController的孩子给添加进去。
- (id)init { if ((self = [super init])) { view = [GameBoardView node]; [self addChild:view]; } return self;}?
? ? 我们然后修改AppDelegate类,然后运行我们新创建的contorller:
[[CCDirector sharedDirector] runWithScene: [GameBoardController node]];??好了,现在编译并运行。当程序跑起来的时候,这个结果和cocos2d自带的模板运行效果差不多。但是,有个很重要的区别,那就是我们创建了一个mvc的骨架,在接下来的游戏逻辑中,我们可以在上面做很多文章。
? ? 该项目进行到现在,已经为我们引入一些更高级的概念打下了良好的基础,所以,在下一篇教程里,我们将涉及下面两个东西: