`

cocos2d里面如何实现MVC(四)

 
阅读更多

 

上一篇文章中,我们使用cocos2d基于mvc做了一个简单了游戏架子,这个架子还非常简单,还有许多东西有待实现。

介绍模型

    在上一篇博文中,我们介绍了view和controller。为了实现mvc模式,我们还需要添加一个model类来维护游戏的状态。我们的实现应该要包含下列这些类:

  1. GameBoardView - 也就是View,
  2. GameBoardController - 也就是Controller.
  3. GameBoard – 也就是Model.


 

Model 实现

GameBoard 实现

    我们在第一部分所描述的需求是这样子的:

    。。。一个game board是通过n行n列组成的,它会随着游戏难度有所变化。

    因此,我们按照下面的编码方式来实现之:

 

@interface GameBoard : NSObject {
    NSInteger numberOfRows;
    NSInteger numberOfColumns;
}
 
- (id)initWithRows:(NSInteger)aNumberOfRows columns:(NSInteger)aNumberOfColumns;
 
@property (nonatomic) NSInteger numberOfRows;
@property (nonatomic) NSInteger numberOfColumns;
 
@end
  请注意,model是从NSObject继承过来的---因为model只需要关注game board的状态就行了(当然,还有相应的更新状态的方法)---我们不应该把其它东西也放进来,比如继承到CCNode就不行,我们并不需要CCNode的东西,所以,为了纯粹性,我们这里继承到game board。

 

GameBoardView 的实现

    我们现在需要修改View,同时它包含一个model的引用,我们可以通过initWithGameBoard方法来初始化这个成员变量:

 

@interface GameBoardView : CCNode {
    GameBoard *gameBoard;
}
 
@property (nonatomic, retain) GameBoard *gameBoard;
 
- (id)initWithGameBoard:(GameBoard *)aGameBoard;
 
@end

 

  具体GameBoardView的实现细节如下:(为了演示方便,我们忽略了实际渲染每一个小方块的代码)

 

- (id)initWithGameBoard:(GameBoard *)aGameBoard {
    if ((self = [super init])) {
        // retain gameboard
        self.gameBoard = aGameBoard;
 
        // render gameboard background
        CCSprite *gameboardSprite = [CCSprite spriteWithFile:@"gameboard.png"];
        gameboardSprite.anchorPoint = CGPointMake(0, 0);
 
        [self addChild:gameboardSprite];
 
        // render spaces
        for (int i = 0; i < gameBoard.numberOfRows; i++) {
            for (int j = 0; j < gameBoard.numberOfColumns; j++) {
                // position and render game board spaces
            }
        }
    }
 
    return self;
}
 

 

GameBoardController

    最后,我们要更新GameBoardController的init方法,因为view需要把GameBoard对象通过init方法注入进去,所以,我们在controller的init方法里面,就应该定义好model对象,然后传递给view。

 

- (id)init {
    if ((self = [super init])) {
        // initialize model
        gameBoard = [[GameBoard alloc] initWithRows:7 columns:9];
 
        // initialize view
        view = [[GameBoardView alloc] initWithGameBoard:gameBoard];
 
        [self addChild:view];
    }
 
    return self;
}
 

 

处理touch事件

GameBoardView updates

    为了能够处理touch事件,我们需要再稍微修改一下View。我们让它继承至CCLayer,而不是CCNode。因为CCLayer内置了处理touch事件的方法:

 

@interface GameBoardView : CCLayer {
...
}

 

  而view本身是不应该处理用户的交互(touch事件)的,所以,我们需要定义一个代理(GameBoardViewDelegate)。(译者:为什么这里要定义代理呢?所谓代理代理,当然就是你不想做的事,找别人去做,这就是代理。所以,当你写代码的时候,你想保持类的简单性、重用性,你就可以把事件尽量都交给其它类去做,自己只管做好自己的事。也就是SRP,单一职责原则。如果一个类关注的点过多,做的事情太多。这些事情不管是你直接做的,还是调用别的对象去完成的。这都不行,自己做这些事,那就会使类的功能复杂化,维护不方便。而过多地调用其它对象来完成一些事情,表面上看起来好像不错,实际上是过度耦合了。我们编写类的原则应该是追求高内聚,低耦合的。可能你会说,用代理不也是交给别人做吗?没错,问的好。但是,代理是接口,我们是针对接口编程,所以它的重用性会非常好。因此,下次当你想写可扩展和可重用的代码的时候,不妨先想想代理这个东西吧。objc里面delegate是用protocol实现的,而java和c++则是用接口实现的,具体他们之间怎么转换的,比较一下应该就可以了。)

 

@protocol GameBoardViewDelegate
- (void)gameBoard:(GameBoard *)gameBoard touchedAtRow:(int)row column:(int)column;
@end

 

 我们还需要再修改一下GameBoardView的init方法,通过传送一个delegate进来处理touch事件。

 

- (id)initWithGameBoard:(GameBoard *)aGameBoard delegate:(id)aDelegate;

 

 下面是touch事件的具体实现:

 

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint point = [self convertTouchToNodeSpace:touch];
 
    // calculate row and column touched by the user and call a delegate method
    // ...
    [self.delegate gameBoard:self.gameBoard touchedAtRow:row column:column];
}
 

 

GameBoardController 更新

    GameBoardController将会负责处理用户touch事件,所以,我们需要让GameBoardController实现GameBoardViewDelegate接口:

 

@interface GameBoardController : CCNode<GameBoardViewDelegate>
 

 

- (void)gameBoard:(GameBoard *)gameBoard touchedAtRow:(int)row column:(int)column {
    // do the game logic here and update view accordingly
}

 

还有最后一步,那就是修改view的init方法,把controller传递进去。

 

// initialize view
view = [[GameBoardView alloc] initWithGameBoard:gameBoard delegate:self];
 

总结

    在这篇文章中,我们实现了Model,同时还通过一些代码把view和controller联系起来了。同时,我们还在view和controller,以及用户touch事件之间建立了联系,这样controller类就可以来响应游戏里面的用户输入了。(译者:为什么费这么多劲,无非就是职责分离,这个非常重要!)。在接下来的文章里面,我们会谈到下面两个问题:

  • 在Controller里面更新Model,
  • 通知View关于Model的改变.
转自:http://www.cnblogs.com/andyque/archive/2012/03/18/2390102.html
  • 大小: 9.3 KB
分享到:
评论

相关推荐

    cocos2D-lua 核心编程内置代码

    在配套代码中,你可以看到各个核心功能的具体实现,通过学习和实践这些示例,可以加深对Cocos2d-lua的理解,提高游戏开发效率。无论是新手还是经验丰富的开发者,这个资源都是宝贵的参考资料,帮助你更好地掌握Cocos...

    GameBoard-《cocos2d-x如何实现MVC》系列中的完整实例

    "GameBoard-《cocos2d-x如何实现MVC》系列中的完整实例"是一个关于如何在cocos2d-x中应用Model-View-Controller(MVC)设计模式的实际项目。MVC模式是一种软件架构模式,常用于构建可维护性和扩展性较高的应用程序,...

    Lua实现PureMVC

    这个是一个根据AS3(ActionScript 3) pureMVC而转换过来的lua pureMVC。所有的接口完全跟AS3版本一致...注意,这个PureMVC中的 class(ClassName, BaseName) 函数并不提供,因为此框架本意就是为了用于cocos2d-x-lua中。

    cocos2d-x C++实现切水果刀刃效果

    在本文中,我们将深入探讨如何使用C++编程语言在cocos2d-x游戏引擎中实现一个生动逼真的“切水果”刀刃效果。cocos2d-x是一个流行的开源跨平台2D游戏开发框架,它基于C++,并支持多种操作系统,如iOS、Android和...

    cocoscreator使用puremvc

    Cocos Creator是一款强大的2D和3D游戏开发引擎,它提供了直观的可视化编辑工具和灵活的组件系统,使得游戏开发变得更加高效。PureMVC则是一个经典的多层应用程序框架,最初设计用于ActionScript环境,但现在已经有了...

    cocosLua中MVC的应用

    在游戏开发领域,Cocos2d-x是一款广泛使用的开源跨平台2D游戏引擎,而Cocos2d-x Lua则是其支持的脚本语言之一,它提供了便捷的lua接口来实现游戏逻辑。MVC(Model-View-Controller)是一种常见的软件设计模式,常...

    在IPhone上用Cocos2d做的一个小游戏

    游戏逻辑的实现主要依赖于Cocos2d的事件处理机制和动作系统。例如,当用户触摸屏幕时,我们可以监听Touch事件,触发忍者发射飞镖的动作。这涉及到EventDispatcher的事件监听和处理,以及Action对象的创建和执行,如...

    cocos2d-js-mvc:基于cocos2d-js的mvc框架,现已不再维护,目前更新的是基于cocos creator的游戏框架ituuz-x

    【cocos2d-js-mvc】是一个基于Cocos2d-js的游戏开发框架,它采用了Model-View-Controller(MVC)的设计模式。MVC是一种软件设计模式,将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller...

    基于Cocos2d-x框架,并使用MVC架构的棋类游戏

    基于Cocos2d-x框架,并使用MVC架构的一个棋类游戏。 Pure MVC架构,构建可维护的Cocos2d-x游戏。 ###使用的框架 Cocos2d-x2.2.3 ###apk下载地址 应用宝 360手机助手 ###相关博客 架构篇:...

    cocos2dx用c++实现MoonWarriors

    《cocos2dx用c++实现MoonWarriors》是一款基于Cocos2d-x游戏引擎,用C++语言编写的简单游戏。Cocos2d-x是一个跨平台的2D游戏开发框架,它允许开发者使用C++、Lua或者JavaScript来创建游戏,并能在iOS、Android、...

    lua实现cocos2d-x的mvvm框架

    MVVM源于MVC(Model-View-Controller)模式,期间还演化出MVP(Model-View-Presenter)模式。MVVM的出现促进了GUI前端开发和后端开发逻辑的分离,提高了前端开发效率。 MVVM的核心是数据驱动即ViewModel,ViewModel是...

    cocos2d-x飞机游戏 源码

    在代码实现上,cocos2d-x遵循MVC(模型-视图-控制器)设计模式,将数据、显示和逻辑分离,使得代码结构清晰,易于维护。游戏的主循环通常在Director类中,负责更新场景、渲染画面、处理输入等。 总结来说,cocos2d-...

    cocos2d-x 2012-03-31开发者大会演讲稿PDF(6)-刘万千 基于cocos2d-x的跨平台游戏制作20120331.pdf

    标题和描述均指向了一个特定的主题:基于cocos2d-x的跨平台游戏制作,这是由刘万千在2012年3月31日的开发者大会上所作的演讲。cocos2d-x是一款广泛使用的开源游戏开发框架,特别适用于创建跨平台的游戏应用,即可以...

    cocos2d-x C++ 版本 塔防 游戏

    在cocos2d-x中实现塔防游戏,开发者需要掌握以下关键知识点: 1. **游戏场景管理**:cocos2d-x中的Scene类是游戏的顶级容器,负责管理游戏的不同阶段。开发者需要创建多个场景来表示游戏的不同状态,如主菜单、游戏...

    知易Cocos2D-iPhone开发教程(1-8)全套文档

    通过这套教程,读者将能够逐步掌握Cocos2D-iPhone的使用方法,从创建简单的静态画面到实现复杂的交互式游戏,从而迈入iOS游戏开发的大门。无论是对编程感兴趣的新手,还是希望转行游戏开发的从业者,都能从中...

    IOS应用源码之【游戏】-BouncingBall1_cocos2d.rar

    【游戏】★★★★★-BouncingBall1_cocos2d 是一个基于Cocos2d引擎开发的iOS游戏源代码项目。Cocos2d是一个广泛使用的开源游戏开发框架,尤其适用于2D游戏。这个项目的源码提供了学习和理解iOS游戏开发的基础,特别...

    IOS应用源码之cocos2d-iphone-0.7.3.zip

    《深入解析iOS应用源码:cocos2d-iphone-0.7.3》 cocos2d-iphone是一款强大的2D游戏开发框架,专为iOS平台设计,它基于开源的cocos2d-x项目,并针对Objective-C和Apple的UIKit进行了优化。在“cocos2d-iphone-0.7.3...

    IOS应用源码之【游戏】ABC123_使用cocos2d开发的游戏.rar

    4. 用户交互:Cocos2d-iOS的触摸事件处理机制使得游戏能够响应用户的触摸操作,实现流畅的游戏控制。 5. 存档系统:可能实现了本地存档功能,保存玩家的进度和成就,以便下次继续游戏。 6. 分数和成就:通过Game ...

    iOS实例开发源码——jotaeme1212-Ejemplos-en-Cocos2D-320a463.zip

    9. **设计模式**:源代码可能运用了MVC(模型-视图-控制器)、观察者模式等设计模式,有助于开发者学习如何在iOS和Cocos2D项目中组织代码,提高代码的可读性和可维护性。 总之,这个压缩包提供的源代码示例是一个...

Global site tag (gtag.js) - Google Analytics