场景与层的关系
编程的时候往往不需要子类化场景,而是子类化层。虽然场景与层之间是1:n组成的关系,但是通过模板生成的工程默认情况下都是1:1的关系。由模板生成的HelloWorldScene.h和HelloWorldScene.cpp文件中声明和定义了层HelloWorld类。场景与层的静态结构关系如xia:scene(1)——layer(1...n)。从这里我们可以看到HelloWorld是子类化Layer,其中createScene()是静态函数,create()也是惊天函数,init()是实例函数用来初始化层,Scene类是Cocos2d-x提供的场景类,其中的create()是静态函数用来创建场景,addChild()是实例函数用来将刚刚创建的层添加到场景中。
场景切换相关函数
场景切换是通过导演类Director实现的,其中的相关函数如下:
- 1)void runWithScene(Scene *scene).该函数可以运行场景,只能在启动第一个场景时调用该函数。如果已经有一个场景运行,则不能调用该函数
- 2)void replaceScene(Scene *scene).切换到下一个场景。用一个新的场景替换当前场景,当前被终端释放掉
- 3)void pushScene(Scene *scene).切换到下一个场景中,将当前场景挂起放入到场景堆栈中,然后切换到下一个场景中。
*4)void popScene().与pushScene配合使用,可以回到上一个场景。 - 5)void popToRootScene().与pushScene配合使用,可以回到根场景。
需要注意replaceScene和pushScene使用的区别,replaceScene会释放和销毁场景,如果要保持原来场景的状态,replaceScene函数不适合,pushScene并不会释放和销毁场景,原来的场景的状态可以保持,但是游戏中也不能同时又太多的场景对象运行。
场景过渡动画
场景切换时是可以添加过渡动画的,场景过渡动画是由TransitionScene类和它的子类展示的。TransitionScene类的直接子类有13个,而且有些子类还有子类,全部的过渡动画类有30多个。但是其使用方式都是一样的类似如下代码:
auto scene = MyFirsh::createScene();
auto rescene = TransitionFlipX::create(1.0f, scene);
Director::getInstance()-> pushScene(rescene);
意思就是基本所有的过渡动画都是这样子写的,我们要做的就是把代码中的TransitionFlipX替换成自己想要的效果就OK了;
场景的生命周期
- 1)bool init()。初始化层调用。
- 2)void onEnter()。进入层时调用
- 3)void onEnterTransitionDidFinish()。进入层而且过渡动画结束时调用。
- 4)void onExit()。退出层时调用。
- 5)void onExitTransitionDidStart()。退出层而且开始过渡动画时调用。
- void cleanup()。层对象被清除时调用。
提示:层继承于节点,这些生命周期函数根本上是从Node继承而来。事实上所有Node对象都有这些函数,只要是子类化这些类都可以重写这些函数,来处理这些对象的不同生命周期阶段事件。:
- void cleanup()。层对象被清除时调用。
重写HelloWorld层中的几个生命周期函数,代码如下:
bool HelloWorld::init()
{
if(!Layer::init())
{
return false;
}
log("HelloWorld init");
...
return true;
}
void HelloWorld::onEnter()
{
Layer::onEnter();
log("HelloWorld onEnter");
}
注意:在重写生命周期函数中,第一行代码应该是调用父类的函数。列如,HelloWorld::onEnter()中第一行应该是Layer::onEnter()函数,如果不调用父类的函数则可能会导致层中的动画,动作或者计划无法执行。