场景切换
根据上一篇,我们建立了自己的MyHelloWorldScene。那么如何从HelloWorldScene切换到MyHelloWorldScene呢?
其实很简单。我们要切换场景,那么得有一个触发点,我们就用HelloWorld右下角的关闭按钮来实现吧。
我们要做的是,按下关闭按钮,不是关闭窗口而是切换到MyHelloWorldScene。那么我们看一下HelloWorldScene.cpp的menuCloseCallback()函数吧。把关闭处理去掉,加上一句话就可以了。(注意:别忘了加MyHelloWorldScene.h头文件)
void HelloWorld::menuCloseCallback(Ref* sender)
{
//Director::getInstance()->end();
Director::getInstance()->replaceScene(MyHelloWorld::createScene());
}
大家看到了,我把MyHelloWorld里面的Label文字和图片都改了,这样看着能清晰一些。
特殊效果
这么直接的变换有点太土了,如何增加一些变换效果呢。Cocos2dx已经为我们准备好函数了,只需要变成下面的代码就OK了。
void HelloWorld::menuCloseCallback(Ref* sender)
{
//Director::getInstance()->end();
Director::getInstance()->replaceScene(TransitionSlideInT::create(2.0f, MyHelloWorld::createScene()));
}
看一下效果,是不是有初步大片的感觉了。
TransitionSlideInT也是一个场景类,它通过Create函数就创建出这种带有滑动效果的场景。
它有两个参数,
float f:场景切换的时间,秒
Scene* scene:你要切换的目标场景
Cocos2dx不只提供了这一种特效,还有其他很多,
比如:TransitionJumpZoom:原场景缩小弹出,新场景放大弹入。
再有TransitionFadeUp:从下到上的百叶窗效果:
其他的不多举例了,大家可以查官方API。那些Transition开头的都是切换场景。
场景的推进和弹出
用replaceScene切换场景,新场景显示出来后,旧的场景资源会被释放。这是非常必要的,因为一个场景有时候会很大,所以切换场景后必须释放旧场景的资源。
那么有些时候,我们不希望旧场景被释放,想新旧场景来回切换,这个就用到了场景的推进和弹出。
把replaceScene换成pushScene:
// HelloWorldScene.cpp
void HelloWorld::menuCloseCallback(Ref* sender)
{
//Director::getInstance()->end();
Director::getInstance()->pushScene(TransitionSplitCols::create(2.0f, MyHelloWorld::createScene()));
}
然后在MyHelloWorldScene里,做下面的修改:
// MyHelloWorldScene.h
void backToScene(Ref* sender);
// MyHelloWorldScene.cpp
auto closeItem = MenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
CC_CALLBACK_1(MyHelloWorld::backToScene, this));
void MyHelloWorld::backToScene(Ref* sender)
{
Director::getInstance()->popScene();
}
popScene和pushScene函数是对应关系。用popScene()函数就可以回到原来的场景了,MyHelloWorld的场景资源会被释放。