场景切换要用到导演类Director,一般有两种方式,大多数是用替换场景(replaceScene),也可以用进栈(pushScene)出栈(popScene)的方式进行场景的替换。

场景切换代码:

 auto scene = HelloWorld::createScene();  // 创建待切换的场景
auto transition = TransitionZoomFlipY::create(1.0f, scene); // 给场景包装动画特效
Director::getInstance()->replaceScene(transition); //运用导演类来进行切换场景

场景切换特效:

 // 慢慢淡化到另一场景
TransitionCrossFade::create(float t, cocos2d::Scene* scene); // 本场景变暗消失后另一场景慢慢出现
TransitionFade::create(float duration, cocos2d::Scene* scene); // 本场景右上角到左下角方块消失到另一场景
TransitionFadeBL::create(float t, cocos2d::Scene* scene); //本场景从上到下横条消失到另一场景
TransitionFadeDown::create(float t, cocos2d::Scene* scene); //本场景左下角到右上角方块消失到另一场景
TransitionFadeTR::create(float t, cocos2d::Scene* scene); //本场景从下到上横条消失到另一场景
TransitionFadeUp::create(float t, cocos2d::Scene* scene); //本场景翻转消失到另一场景(斜上方)
TransitionFlipAngular::create(float t, cocos2d::Scene* s, cocos2d::TransitionScene::Orientation o); //本场景翻转消失到另一场景(X轴)
TransitionFlipX::create(float t, cocos2d::Scene* s, cocos2d::TransitionScene::Orientation o); //本场景翻转消失到另一场景(Y轴)
TransitionFlipY::create(float t, cocos2d::Scene* s); //本场景翻转消失到另一场景(斜上方)
TransitionZoomFlipAngular::create(float t, cocos2d::Scene* s, cocos2d::TransitionScene::Orientation o); //本场景翻转消失到另一场景(X轴)
TransitionZoomFlipX::create(float t, cocos2d::Scene* s, cocos2d::TransitionScene::Orientation o); //本场景翻转消失到另一场景(Y轴)
TransitionZoomFlipY::create(float t, cocos2d::Scene* s, cocos2d::TransitionScene::Orientation o); //另一场景由整体从下面出现
TransitionMoveInB::create(float t, cocos2d::Scene* scene); //另一场景由整体从左面出现
TransitionMoveInL::create(float t, cocos2d::Scene* scene); //另一场景由整体从上面出现
TransitionMoveInT::create(float t, cocos2d::Scene* scene); //另一场景由整体从右面出现
TransitionMoveInR::create(float t, cocos2d::Scene* scene); //本场景从左到右消失同时另一场景出现
TransitionProgressHorizontal::create(float t, cocos2d::Scene* scene); //本场景从中间到四周消失同时另一场景出现
TransitionProgressInOut::create(float t, cocos2d::Scene* scene); //本场景从四周到中间消失同时另一场景出现
TransitionProgressOutIn::create(float t, cocos2d::Scene* scene); //本场景逆时针消失到另一场景
TransitionProgressRadialCCW::create(float t, cocos2d::Scene* scene); //本场景顺时针消失到另一场景
TransitionProgressRadialCW::create(float t, cocos2d::Scene* scene); //本场景从上到下消失同时另一场景出现
TransitionProgressVertical::create(float t, cocos2d::Scene* scene); //本场景向上滑动到另一场景
TransitionSlideInB::create(float t, cocos2d::Scene* scene); //本场景向右滑动到另一场景
TransitionSlideInL::create(float t, cocos2d::Scene* scene); //本场景向左滑动到另一场景
TransitionSlideInR::create(float t, cocos2d::Scene* scene); //本场景向下滑动到另一场景
TransitionSlideInT::create(float t, cocos2d::Scene* scene); //本场景三矩形上下消失后另一场景三矩形上下出现
TransitionSplitCols::create(float t, cocos2d::Scene* scene); //本场景三矩形左右消失后另一场景三矩形左右出现
TransitionSplitRows::create(float t, cocos2d::Scene* scene); //本场景小方块消失到另一场景
TransitionTurnOffTiles::create(float t, cocos2d::Scene* scene); //翻页切换,bool为true是向前翻。
TransitionPageTurn::create(float t, cocos2d::Scene* scene, bool backwards); //本场景跳动消失后另一场景跳动出现
TransitionJumpZoom::create(float t, cocos2d::Scene* scene); //本场景旋转消失后另一场景旋转出现
TransitionRotoZoom::create(float t, cocos2d::Scene* scene); //本场景缩小切换到另一场景放大
TransitionShrinkGrow::create(float t, cocos2d::Scene* scene);

我们很容易在 pushScene 跟 replaceScene 中添加动画,可是 popScene 没有提供动画,解决方法就是(如果使用VS打开的话)在右边栏的解决方案搜索框中搜索 CCDirector.h , 找到 void popScene(); 在这个函数下面添加以下代码:

 void Director::popScene(const std::function<void(Scene* &)>& callback)
{
CCASSERT(_runningScene != nullptr, "running scene should not null"); _scenesStack.popBack();
ssize_t c = _scenesStack.size(); if (c == )
{
end();
}
else
{
_sendCleanupToScene = true;
_nextScene = _scenesStack.at(c - );
if(callback)
callback(_nextScene);
}
}

在使用的时候:

 auto callback = [](Scene*& scene){scene = TransitionJumpZoom::create(1.0f, scene);};
Director::getInstance()->popScene(callback);

Scene生命周期:

pushScene 和 popScene:

假设scene A是活动场景,现在我们要用scene B通过pushScene来替换A,A和B的生命周期是这样的:

B ------ init();

A ------ onExit();

B ------ onEnter();

B ------ onEnterTransitionDidFinish();

此时 popScene ,弹出scene B,函数调用如下:

B ------ onExit();

B ------ 析构函数被调用

A ------ onEnter();

从上面可以看出:

1. A的析构函数一直未被调用,因此A一直在内存中;

2. 初始化最好放在 init() 中,最好不要放在 onEnter() 中,因为我们用 pushScene 跟 popScene 一般是为了暂停场景,可以如果初始化放在onEnter()中的话,可以看到 popScene之后会调用 A 的onEnter(),可能就会再次初始化。

replaceScene:

假设 scene A 是活动场景,现在我们用 scene B 通过 replaceScene 来替换 A ,A 和 B 的生命周期是这样的:

B ------ init();

A ------ onExitTransitionDidStart()

A ------ onExit();

A ------ 析构函数被调用

B ------ onEnter();

B ------ onEnterTransitionDidFinish();

此时 B replace A ,函数调用如下:

A ------ init();

B ------ onExit();

B ------析构函数被调用

A ------ onEnter();

Cocos2d-x 3.0 场景切换的更多相关文章

  1. Cocos2d-X研究之3.0 场景切换特效汇总

    Cocos2d-X研究之3.0 场景切换特效汇总 2014-08-05      0个评论    来源:游戏编程    收藏    我要投稿 cocos2d-x 3.0中场景切换特效比较多,而且游戏开 ...

  2. cocos2d-x 3.0 场景切换特效汇总(转)

    cocos2d-x 3.0中场景切换特效比较多,而且游戏开发中也经常需要用到这些特效,来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 场景切换用到导演类Directory,大多数用的都是替 ...

  3. cocos2d-x 3.0 场景切换特效汇总

    cocos2d-x 3.0中场景切换特效比較多,并且游戏开发中也常常须要用到这些特效.来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 场景切换用到导演类Directory,大多数用的都是替 ...

  4. [cocos2d]场景切换以及切换进度显示

    本文主要分两个部分叙述,第一是场景切换,第二是场景切换的进度显示. 一.场景切换 参考learn-iphone-and-ipad-cocos2d-game-development 第五章内容 coco ...

  5. Cocos2d-X3.0 刨根问底(九)----- 场景切换(TransitionScene)源码分析

    上一章我们分析了Scene与Layer相关类的源码,对Cocos2d-x的场景有了初步了解,这章我们来分析一下场景变换TransitionScene源码. 直接看TransitionScene的定义 ...

  6. Cocos2d-X3.0 刨根问底(九)----- 场景切换(TransitionScene)源代码分析

    上一章我们分析了Scene与Layer相关类的源代码,对Cocos2d-x的场景有了初步了解,这章我们来分析一下场景变换TransitionScene源代码. 直接看TransitionScene的定 ...

  7. cocos2d 场景切换和弹出场景、收回场景

    场景弹出收回很简单 用以下代码在任意一个地方显示“设置场景”: [[CCDirector sharedDirector] pushScene:[Settings scene]]; 如果你身处“设置场景 ...

  8. 【Cocos2d-x 3.x】 场景切换生命周期、背景音乐播放和场景切换原理与源码分析

    大部分游戏里有很多个场景,场景之间需要切换,有时候切换的时候会进行背景音乐的播放和停止,因此对这块内容进行了总结. 场景切换生命周期 场景切换用到的函数: bool Setting::init() { ...

  9. 8 cocos2dx加入场景切换效果,控制场景切换彻底完毕之后再运行动画

     1 加入场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadial ...

随机推荐

  1. Oracle字符串分割函数

    今天在创建视图的时候,碰到一个问题,问题如下: 将字符格式为“XXX,YYY”分割出来,并且分割后作为两个字段放入视图中. 考虑使用字符分割函数,但是查找资料Oracle没有字符分割的函数(我对Ora ...

  2. JS全部API笔记

    我相信对于程序猿都有做笔记的习惯. 我初学到现在也做了不少笔记,以前,总是怕写的文章或者好的内容分享出来就怕被直接copy以后更个名就不再是你的. 但通过博客园,学习到不少东西,人家都不怕什么了,我自 ...

  3. JQuery 判断ie7|| ie8

    if( $.browser.msie && ( $.browser.version == '7.0' || $.browser.version == '8.0'|| $.browser ...

  4. jquery 点点滴滴小记

    字符截取显示 var text = $(".content").text(); var textNum = text.length; var textInt = text.slic ...

  5. 类和对象:给大家介绍对象 - 零基础入门学习Python036

    类和对象:给大家介绍对象 让编程改变世界 Change the world by program 我们之前说过Python无处不对象,Python到处都是对象,然后你会发现很多童鞋其实并不知道对象是什 ...

  6. 【转】Android ListView长按事件触发点击事件

    原文网址:http://blog.csdn.net/twlkyao/article/details/17301609 算法在实现ListView的onItemLongClickListener的时候, ...

  7. bzoj3174 [Tjoi2013]拯救小矮人

    Description 一群小矮人掉进了一个很深的陷阱里,由于太矮爬不上来,于是他们决定搭一个人梯.即:一个小矮人站在另一小矮人的 肩膀上,知道最顶端的小矮人伸直胳膊可以碰到陷阱口.对于每一个小矮人, ...

  8. 【译】Javascript中的数据类型

    这篇文章通过四种方式获取Javascript中的数据类型:通过隐藏的内置[[Class]]属性:通过typeof运算符:通过instanceof运算符:通过函数Array.isArray().我们也会 ...

  9. log4net 快速上手使用

    *本随笔仅限快速上手,如需深入探究,可查阅其它博友. 一.下载log4net.dll并添加引用; 二.添加配置文件 log4net.xml : <?xml version="1.0&q ...

  10. (转)iOS7界面设计规范(2) - UI基础 - iOS应用解析

    今天再来一发,然后结束掉周六的忙碌,去吃零食,还有冰啤酒:其实现在打嗝还有小龙虾味儿呢. 第二篇更多的是从技术的角度对iOS界面组成原理进行了简单的解析,篇幅很短,可稍作了解:更多关于iOS开发入门的 ...