cocos2d-x初学者教程(二)
上一节,我们主要了解了Cocos2d-x的相关内容。我相信已经熟练掌握的同学,可能已经开始进行测试,甚至用它来开发项目了。对于初学者而言,还需继续努力去了解和掌握它。而正在进行项目开发的同学,不妨听听我对Cocos2d-x的进一步见解。
Cocos2d-x项目的MVC框架
这里所说的Cocos2d-x项目的MVC框架,其实是我个人对MVC框架在Cocos2d-x项目中的理解。由于我并非专业出身,运用得也不是十分出色,还请各位读者见谅。
本篇教程使用的Cocos2d-x版本为:Cocos2d-x 3.2。
当我们搭建好项目并开始编写代码时,常常会遇到一些问题。例如,某些UI类加载到父级上后,会毫无缘由地导致程序崩溃;或者代码行数达到数千行,维护困难,也难以让他人协助处理。这是为什么呢?
实际上,主要有两个原因:
- 对Cocos2d-x的了解不够深入。
- 缺乏框架的概念。
这些问题往往是因为子级元素在父级调用addChild方法之前,就开始调用父级元素;或者在编写代码时,没有进行合理规划,只是一味地埋头编写。
我在交流群中,经常用这样的比喻来形容这些问题:“孩子还在母亲肚子里没出生,怎么能让它去打酱油呢?”“孩子本应有无限的未来,为何不先为它规划好未来,而是直接给它戴上紧箍咒,让它束手束脚呢?”
我在初学Cocos2d-x时,也存在一个常见的误区,就是在init函数里添加显示UI或需要父级的数据等代码。虽然在init函数里添加显示UI的代码本身没有问题,但从我的编程经验来看,这样做并不好。我认为初始化就应该专注于初始化的工作,UI的加载应该在专门的UI函数中进行,逻辑处理则应该放在逻辑函数内,而不是将代码随意分散在各个地方。
了解MVC框架的同学应该清楚MVC的含义,下面引用百度对MVC的定义:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种软件设计典范。它采用业务逻辑、数据和界面显示分离的方式组织代码,将业务逻辑封装到一个部件中。在改进和个性化定制界面及用户交互时,无需重新编写业务逻辑。MVC被专门用于将传统的输入、处理和输出功能映射到逻辑图形化用户界面的结构中。
我刚开始接触MVC框架时,也纠结了很久。对于小项目而言,使用这种框架会比较耗时,因为原本在一个类中就能完成的任务,却要分成管理器、业务、UI、逻辑四个部分。不过,这也是见仁见智的事情。
下面说说MVC框架的优缺点:
优点
- 可以轻松地将以前的业务应用到任何新项目中。
- 当策划变更逻辑或美术改变UI时,无需对逻辑和业务进行过多修改。
- 能够轻松定位问题所在,代码更加鲜明、整洁、规范。
缺点
会让人觉得繁琐,明明简单的业务,却要编写复杂的代码。
那么,将MVC框架应用到Cocos2d-x中会是什么样子呢?
首先,来看我编写的基类BaseLayer。根据我的经验,BaseLayer包含以下几个简单的函数:
- 初始化及数据读取
- 显示及加载UI
- 加载逻辑与返回逻辑
具体来说,init()函数仅负责初始化,showUI()函数负责显示及加载UI,加载与返回逻辑的函数则负责逻辑处理。
对比MVC架构和BaseLayer:
- 模型(model)——对应
BaseLayer数据的初始化及本身业务。 - 视图(view)——对应
BaseLayerUI的初始化及加载。 - 控制器(controller)——对应
BaseLayer的逻辑处理及返回。
BaseLayer的实现步骤通常如下:
init();GetReadData();LoadUILogic();showUI();ReturnLogic();
以装备升级功能为例,现在有一个需求,要实现装备的升级功能。我们以BaseLayer为基类,派生出业务类Equipment_LvUp(请原谅我的英语水平)。
Equipment_LvUp* m_pEquip = Equipment_LvUp::create();
this->addChild(m_pEquip);
m_pEquip->GetReadData(...);
m_pEquip->LoadUILogic(...);
m_pEquip->showUI();
从上述代码顺序可以看出,先初始化数据,然后获取业务必要数据,接着加载业务逻辑,最后显示业务视图UI。这样做的好处是,如果出现问题,可以轻松判断是数据、显示还是逻辑方面的问题。而且,当业务逻辑变更时,可以根据需求调整代码,既清晰又直观。此外,还可以将业务放在不同的管理器下随时调用,非常方便。
我们还可以根据不同的需求,对其进行进一步的重构和功能提升,例如实现资源的异步加载、优化业务算法等。也可以将代码分为管理器、业务、UI、逻辑四个类来编写,这些方法都可以选择,这里只是提供一种思路和方式。
通俗来讲,MVC框架就好比玩英雄联盟,玩家通过鼠标和键盘操作触发事件,这可以看作是直观的逻辑处理。每次按下QWER键,都会通过键盘映射到相应的逻辑进行处理,逻辑处理完成后通知相关UI进行动画或渲染,然后UI提供新的界面供玩家进行新的选择。
从Cocos2d-x的demo中,也能看出这种框架模式的应用:
- 逻辑分离:根据逻辑引用计数的增加和减少,采用不同的类进行处理。
- 类的职责单一:每个类只负责自身的显示及动画效果。
好了,简单的MVC架构模式就介绍到这里。下一期将讲解整个游戏工程的架构。