我对cocos2dx的理解和总结
刚接触游戏开发不久,第一个工具选用了cocos2dx这个跨平台游戏引擎,在一个多月的使用中,我一直在试图领略作者在设计这个引擎时候所使用的核心思想,并希望用最简单的语言将自己对这个引擎的理解表达出来。本文是到目前为止我对cocos2dx最主要的理解,这个理解在之前的使用和学习中已经有多次修正,在这里将这一版本写成微博,和大家相互交流,欢迎批评指正。
- Cocos2dx有些什么:
1、一颗或多颗Node组成的树,Node可以按照规定对不同的事件作出响应,执行一些任务。
2、一个导演,管理这这些树并不停地给树拍照
- 这些事件可能有:
1、导演准备好相机了(进入场景onEnter等游戏事件)
2、导演要拍照了(帧事件)
3、来了一阵风(外部事件,触摸、键盘)
1、告诉导演拍那棵树、以什么样的速度拍、相机调成什么模式
2、给树修剪并摆好造型(操作Node)
- 编写一个游戏的基本工作
1、创建一个导演和至少一棵树,完成基本配置
2、给树上面的Node编写响应函数,将游戏逻辑在其中表示,通过编写响应函数,我们将游戏逻辑通过cocos2dx的树进行描述并通过导演进行展示。
下面对以上的总结进行详细的解释:
实现一个cocos2dx的游戏,有几个核心的类几乎是都会用到的:导演Director、场景Scene、布景层Layer、精灵Sprite。
这些类全部继承自cocos2dx的基础类ref,而这四个类有分为两支,一个是director直接继承自Ref,另一个是Scene、Layer、Sprite三大类,他们都继承自Node这个类。
这个director就是上面所说的那个拍照的导演,而后面的三个继承自Node的类,就是组成我们这个树的主要元素。
在这里,导演类主要负责以下几件事情:
1、创建一个窗口
2、管理场景
3、与OpenGL打交道
所以说,我们的导演就是拍照(创建窗口)给我们看的那个人,同时因为他和OpenGL打交道,所以说他可以操作摄像机拍出各种效果,最后呢,他还能通过管理场景决定拍哪棵“树”。
再说说那棵树,在cocos2dx中,所有展示出来被我们看到的东西,几乎都是一个Node,Node有几个主要的功能,例如添加到某个父节点、添加子节点、设置显示内容、设置大小、设置位置、设置锚点等等。继承自Node的几个类,均继承了Node的这些功能,同时又根据自己的定位有不同的特性。
cocos2dx使用Node这个类以及它的衍生类,通过经典的组合模式,使得绘制游戏场景变得轻松而且严密。这和Node的两个特性是分不开的,一个是每个Node作为树的组成部分,他可以管理自己的父节点和子节点,这使得游戏场景中所有的元素都被联系并管理起来;二是每一个带有多个子节点的Node在组合模式的设计下,可以被当做一个Node来进行操作。
这样,我们所说的场景设计,就简单地编程了设计一棵树,我们在scene这个根节点上放上几个Layer,然后再在Layer上放几个Sprite,让sprite按一定顺序或逻辑动起来,一个场景就做出来了,在执行逻辑的时候,对一个Layer进行操作(例如隐藏),它上面所有的Sprite都会跟着响应,非常方便。当然也可以不这样的顺序来,因为他们都是Node,只要应用的合适,可以任意的组合,甚至可以定制自己的Node来进行绘制。
最后,由于导演和Node都继承自ref,他们都享受了cocos2dx内存管理(类似垃圾回收)机制带来的福利,在不被使用的时候会被自动回收,大大减小了c++内存管理的工作量。
以上就是cocos2dx帮我们解决的场景管理、绘制以及展示的工具,给我们带来的设计上的便利,那么我们如何利用cocos2dx实现游戏的编写,或者说如何通过代码将游戏的数据和逻辑转化成可视可控的2d游戏。
于是就要用到cocos2dx三个重要的事件,一是游戏的事件,最主要是帧事件,就是我们所说的导演拍照,还有诸如进入场景的事件等,二是cocos2dx的外部事件(如触摸、点击等),三是游戏自定义的事件,我们主要通过定义这三个事件的响应实现游戏的逻辑。
通过cocos2dx开发游戏,我们要做的有如下几样工作:
1、在进入程序主循环时创建导演,做一些相关的设置、创建一个Scene并由导演执行
2、设计游戏的逻辑,主要是每帧的响应逻辑和对不同事件的响应逻辑,在这些逻辑中,我们完成游戏的数据处理,并根据当前的游戏状态,操作当前的场景,对上面的Node进行增删、显示、播放动画等操作,或者进行场景切换,实现逻辑层到显示层的转化。
以上是我对cocos2dx的简单的理解,当然cocos2dx经过多个版本的发展,已经具备非常庞大的功能体系,同时一个复杂2d游戏的开发还需要用到更多的功能和体系。 本文希望通过简单的比喻,就cocos2dx在实现游戏逻辑的思想上做一些总结和学习。