《魔塔天城》发布已经有半年的时间了,一直想找时间来总结一下这个项目,但总是一拖再拖。如果再这么拖下去,就永远都不会有时间来写这个总结了,时间总是挤出来的。
魔塔天城使用的cocos2dx 3.2版本,当时这个版本刚刚发布。网上的学习资料都是2.0版本的。只有官网提供的示例demo是最新的,好在这些demo涵盖的面比较宽,对于学习API来说已经足够了。
魔塔的程序框架并不复杂
总的来说就是这几大块,对象继承结构,碰撞检测,node和layer层次结构,UI实现,剧情脚本
首先是对象继承结构,在我的程序世界中 World是由Cell构成的,所有的事物都是Cell。Cell里有所有事物的基本属性和方法。Cell有它自己的属性集合,这个集合就是我们所说的MVC模式中model,我们从外部读取数据表格文件中的数据(这里我使用了csv文件),然后初始化这些Cell的model(注意:数据表格中的数据通常记录的是类的基本属性),在游戏中不同的对象model会产生不同的变化,如果我们想要保存这些变化,只要保存这些容易发生变化的属性就行了,这里假设保存在model_New里。然后下次再加载存档的时候,首先利用数据表格初始化model,然后再加载保存的model_New覆盖合并当前model,这就是基本的存档功能。
所以我的Cell必须实现这些初始化,加载并保存model的功能,这里我们就可以添加这些函数
virtual void initModel() = 0; virtual void loadModel(ValueMap &map) = 0; virtual ValueMap saveModel() = 0;
这里我们使用cocos2dx 3.2 提供的 ValueMap数据结构实现我们的model。
每一个事物都有自己的名字对吧,因此我们的Cell里也要定义名字属性 name。
事物之间是需要交互的,这样我们的世界才如此生机盎然。在程序里,事物就是对象,那么如何让对象之间交互呢,没错,利用事件Event。cocos2dx已经为我们实现好了这些事件机制,我们唯一需要做就是为每个对象添加事件侦听或回调函数。
事件监听
_listener = EventListenerCustom::create(getName(), [=](EventCustom *event){onTrigger(event);});_eventDispatcher->addEventListenerWithFixedPriority(_listener, 1);
回调函数
virtual bool onTrigger(EventCustom *event) = 0;
事件机制就是观察者模式的衍生,在cocod2dx中我们的事件都由EventDispatcher的一个实例来管理,这就像是接线员一样。会根据号码(事件id)来传递事件。这个事件id我们用对象的名字来表示,因此,这就变得非常好理解了,对象之间通过名字来交互也更现实些。
未完待续(后面会依次介绍整个项目)