场景切换要用到导演类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. MVC4 路由参数带点 文件名后缀导致错误

    错误描述 最近在研究office在线预览,用到mvc4  apicontroller 需要传参是文件名,如test.docx导致错误"指定的目录或文件在 Web 服务器上不存在", ...

  2. Java学习笔记--StringTokenizer的使用

    拓展:Pattern.split替代String.split http://www.cnblogs.com/gnivor/p/4386978.html StringTokenizer是一个用来分隔St ...

  3. Lintcode--009(单词切分)

    http://www.lintcode.com/zh-cn/problem/word-break/ 单词切分 给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词. ...

  4. [每日一题JS] 正则表达式

    判断字符串是否是这样组成的,第一个必须是字母,后面可以是字母.数字.下划线,总长度为5-20 var reg = /\b[a-zA-Z]{1}[a-zA-Z0-9_]{4,19}\b/; var fl ...

  5. (摘)oracle dataguard切换

    众所周知,Data Guard已经是现今标准的主流容灾方案,由于日志传递对于网络适应程度强,且可以采用同步实时的传递方式和异步延迟的传递方式,甚至可以成为远程的异地容灾方案.不管用于何种用途,DG都免 ...

  6. 【操作系统】进程间通信(C#)

    原文:[操作系统]进程间通信(C#) 08年9月入学,12年7月毕业,结束了我在软件学院愉快丰富的大学生活.此系列是对四年专业课程学习的回顾,索引参见:http://blog.csdn.net/xia ...

  7. inux xsel 拷贝复制命令行输出放在系统剪贴板上

    转载自:http://oldratlee.com/post/2012-12-23/command-output-to-clip 为什么要这么做?直接把命令的输出(比如 grep/awk/sed/fin ...

  8. Jtree(节点的渲染+资源管理器)(2)

    上一次我们建立一个比较简单的资源管理器,这次我们说一下上面的资源管理器的问题,并且得尽量的贴近windows的资源管理器. 这样一个简单的资源管理树就完成了,下面我们说说它的问题: ① 图片和外观和W ...

  9. Underscore.js(1.7.0) 中文文档 Underscore.js 入门

    原文地址:http://www.css88.com/doc/underscore/ Underscore.js 入门   http://www.tuicool.com/articles/jQ3IfeR

  10. stardict词典(星际译王)

    sudo apt-get install stardict 下载词库: http://abloz.com/huzheng/stardict-dic/zh_CN/ 把下载的压缩包解压,以a为例cd /u ...