创建我们自己的Scene
与上一篇隔了好长时间,期间遇到期末考试,又是赶上新年,所以落下了一段时间没有写。
最近转战到Unity3D了,也打算出个学习记录,在此顺便做个提前预告,希望喜欢Unity3D的小伙伴们能够多多指教哦!
前情回顾
上一篇,我们分析了Cocos2d-x自带的HelloScene,理清了了从引擎启动,到显示第一个Scene的过程。
“纸上得来终觉浅,觉知此事要躬行。”这一篇呢,我们就来实现自己的场景。
1. 添加自己的场景类
自己的场景类 MyScene普通的C++类,两个文件,一个头文件,一个源文件。
首先来看的是头文件,看看定义了那些接口。
'
仿照HelloWorldScene头文件,定义了一个成员函数,一个静态方法,和一个宏函数,下面逐个介绍一下为什么要定义这些函数,以及它们都有什么作用。
1.virtual bool init()
这是MyScene的初始化函数。Cocos2d-x在构造新对象时,采用了创建和初始化分开的操作。new
操作实际上进行的主要任务就是对象内存的分配,对象属性初始化的工作集中在了init
函数中。有一点需要注意的是,子类的init
函数实现的时候,需要手动调用父类的init
函数,来进行父类的初始化;没有构造函数能够自动初始化父类的功能。再说init
的返回值,指示的是对象初始化是否成功。
-
static cocos2::Scene* createScene();
静态工厂函数,负责场景的创建。如果你比较细心,就会发现,我们的MyScene
它其实不是个Scene,它继承的是Layer
啊。这边因为只是一个小的 场景,所以并没有把场景和层区分的太开。事实上,场景可以看作是许多Layer的容器,一个场景可以有许多的Layer。一般来说,场景是看不见的,而Layer确实实在可见的。
这里的静态函数,是创建了一个Layer,然后也创建了一个Scene,将Layer添加到Scene中,故其名字叫做createScene
。 -
CREATE_FUNC
宏函数
关于这个宏的讲解在前面一篇中有所提到,如果不太记得的小伙伴可以翻看前面一篇cocos2dx之HelloWorld代码分析
。这里再次简述一下,这个宏函数负责创建了MyScene
对象,加入到了自动释放池,并且调用了它的init
方法。这个方法不需要实现,宏帮助你自动完成了。
2. 实现init
方法
MyScene::ini
这是我们的实现。
很简单,添加了红绿蓝三个矩形方块。正如前面所说的,我们看到在这儿调用了父类中的init
方法,并且也根据其返回值来判断是否初始化成功。
关于三个层的创建代码,此处按下不表,后面章节会做细致的解释。
此处需要注意的是addChild
函数的调用,需要将创建的Layer加入到我们的MyScene中,为什么要这样呢?原因是cocos2dx采用了树形的对象管理方案,创建的三个colorLayer
通过调用addChild
函数成为了MyScene
的子对象,引擎在渲染MyScene
对象的时候,会把它的子对象一并进行渲染。别忘了最后返回一个true
,来说明你的对象如期创建成功了。
3. createScene
静态函数的实现。
MyScene:createScene
场景创建的一个静态工厂函数。代码真的是一目了然,先创建一个场景,然后创建一个层,把层加入到场景中,返回该场景。
3. 运行我们的Scene
前一篇我们知道,引擎启动时候会调用bool AppDelegate::applicationDidFinishLaunching()
函数,在此,我们切换到AppDelegate.cpp
文件,找到bool AppDelegate::applicationDidFinishLaunching()
函数,在函数最后添加如下代码:
相关的头文件包含,相信熟悉C++的你一定会厌烦我再重复。
编译生成之后,就可以看到相应的效果了。
如果有什么问题的欢迎在下面评论区提出,我一定给你细致答复。加我微信也可:LCJY93,欢迎指教。
结尾
希望你的游戏开发之旅充满快乐,希望你和我一样热爱游戏,热爱游戏开发!
下回预告
是时候展现真正的技术了!