Cocos2d-x开发中的MVC1

Cocos2d-x开发中实现MVC结构(1)

使用写Cocos2d-x引擎写过几个项目,几乎都是将[控制逻辑][显示][数据]写在同一个层(Layer)中。不少使用Cocos2d-x引擎的新手可能都会犯这种错误

虽然在小型项目中,这种耦合式的代码构建方式并不会导致项目完全无法维护和更新,但是相对来说,使用这种方式构建项目,程序员的工作复杂度是成倍增长的。

所以,经过几段痛苦的经历之后,我醒悟了。甚至感慨:学习要从体系结构开始,不要脑袋一热就直接去研究某个功能点,即使这个功能点无比重要,它也只是整体的一个部分。

目录

误区

  • 使用Cocos2d-x引擎进行游戏开发很简单

    使用Cocos2d-x引擎进行游戏开发确实很简单。但是这个结论是有前提的:
    1.了解Cocos2d-x引擎能做什么。
    2.用来开发 简单的 &休闲&单机 手游。
    3.有一定的程序结构意识。

  • 直接在Scene中开始项目

    1.确实可以参照Cocos2d-x引擎新建项目中的 HelloWorldScene 来做(在Scene中创建一个Layer,在Layer中添加UI按钮,添加游戏元素)。但是请不要忽略它只是一个 示例 的事实。
    2.不要一拿到Scene就开始添加Layer,不要一拿到Layer就开始添加Sprite!如果执意要这样做,一般情况下,形成的程序结构就是上面提到的耦合结构。

  • 直接使用引擎提供的API

    1.Cocos2d-x引擎不是一个 独立的、完整的 游戏引擎。因为根据项目需求,我们可能不会去用Cocos2d-x封装的SimpleAudioEngine来实现游戏音效的控制。游戏中常用的物理引擎Box2D等,也不属于Cocos2d-x。
    2.我们需要有自己的工具封装。例如对 SimpleAutioEngine 进行封装,然后开放游戏所需音效控制接口,这样当后期需要某些SimpleAutioEngine不能实现的效果时,我们可以在游戏音效模块中进行引擎替换,客户端不需要在游戏控制逻辑中去一个一个替换播放音响的语句。

  • 引擎的代码与我无关(这里的我,是指使用引擎的人)

    1.Cocos2d-x引擎优点在于 跨平台&开源 。代码有Bug很正常,尤其对于这样大型的项目来说。此时 开源 的好处就体现出来了,我们可以根据需要去修改引擎的代码(慎重)。
    2.通常在比较大型、开发周期相对较长的项目中,团队会在Cocos2d-x某一版引擎的基础之上进行一些二次开发与修改,以避免某些引擎的bug,以及提供一些(项目需要的)常用功能。

优缺点

在程序开发中使用MVC架构的优缺点,在网上可以查到很全面的说法,这里就不赘述。只是举例说明一下,目前我在游戏设计中应用MVC架构时发现的优缺点。

优点

  • 目前在游戏开发中,添加美术资源 是一项比较费心费力的工作。使用MVC分层结构后,添加美术资源时,几乎只需要去修改View模块即可。
  • 可以达到在 没有美术资源 的情况下(没有View模块),程序也能运行,也可以进行数据调试。
  • 将游戏数据集中起来,统计与优化会变得更加方便。
  • 在需要进行游戏的 操作方式、响应方式 的修改时,更加方便,几乎不用去理会View模块的内容。

缺点

  • 单独实现某个小功能时,程序员需要做的工作可能比 直接写逻辑和显示(耦合式) 更多。因为应用MVC就相当于指定了某种程序开发规范。
  • 使用某些可视化工具进行UI开发,可能与MVC结构有冲突。

基础实现思想

MVC架构是程序设计中的经典架构。不仅是在游戏中,在各种 App、应用系统 的设计中,都可以应用这个思想。当然,在游戏开发中仅仅应用MVC分层结构可能是不够用的,往往还需要一些设计模式(单例模式、工厂模式、委托模式等)来实现更细节的代码结构。

那么,回到 在Cocos2d-x项目中实现MVC结构 的主题来。对MVC的实现进行一个大体上的构思。

Controller模块

从HelloWorld示例来看,Director必须运行一个Scene(这也是导致很多人将控制逻辑与视图代码写在一起的原因),所以我们可以拿第一个Scene做为游戏程序的入口

Scene可以添加Layer,而Layer属于View模块。所以,刚好就拿Scene作为Controller。如果游戏有多个Scene(例如MainScene,GameScene,ResultScene等),这些Scene相互之间应该是功能独立的,各个Scene之间可以通过其他方式(Manager单例等)来共享数据。

View模块

在Scene中可以包含多个Layer。在Layer上,我们可以添加Sprite、Menu、ui::Listview等,所以可以把Layer作为View模块的基础。由Scene(Controller)来管理当前的Layer。

一个Controller可以管理多个View。因为游戏中展示给玩家的视觉层面的内容,往往是由多个功能相互独立的Layer叠加而成的。

Model模块

Model是游戏中最特例化的模块,它就是游戏中的各个元素,是与Cocos2d-x引擎无关的类。例如在一个战斗类游戏中,主角、怪物等属于Model,主角的装备、宝石、药水也属于Model。但是要注意,Model不包含View内容,也就是说玩家看到的主角,实际上是由View模块来展示的。

Model包含了一些属性,以及一些功能逻辑(重要的事再说一遍:Model不包含Sprite等显示模块的内容)。例如:主角包含了血量、攻击力等,这都属于属性;主角被攻击会掉血,血量为0会死亡,这都属于功能逻辑。

一个Controller可以管理多个Model。

总结

本文简单描述了在Cocos2d-x游戏开发中应用MVC框架的构思。其实在Unity3D引擎中也可以通过同样的方法来应用MVC。

重要的事再强调一遍

使用Cocos2d-x引擎进行游戏开发,你不止拥有Node、Scene、Layer、Sprite、Menu,你也不止拥有Director、FileUtils、SimpleAudioEngine。

重要的是,你可以拥有你自己的Manager、Tools,可以自己实现附带特殊显示效果的UI,可以使用其他的物理、音效等引擎。不要局限于Cocos2d-x引擎的内容。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...