场景切换要用到导演类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. CentOS 7 之安装篇

    程序员是一个学到老的行业,因为新换一个公司,感觉也轻松了好多,自己想想还是多学一些知识吧,中国政府都要强制以每年15%的比例使用国产系统,相信Linux还是有必要学习的.因为曾经在文思做Expedia ...

  2. n阶行列式计算----c语言实现(完结)

    花了半天时间,写了这个n阶行列式计算的程序,应该算是比较优美吧,有很多地方多次做了优化,程序占用内存不是很大,要是说小吧,也不合适,因为里边有一个递归,而且递归的深度还比较深.时间复杂度具体没有细看, ...

  3. js 当前系统时间

    <script language=Javascript> function time(){ //获得显示时间的div t_div = document.getElementById('sh ...

  4. Javascript 原型注意事项

    function abc() {} abc.prototype.xx = { name: "keatkeat" } var x = new abc(); x.xx.name = & ...

  5. 深入理解7816(1)---- 关于F/D和etu

    对于刚接触智能卡的工程师来说,在阅读7816-3规范的时候,常常被其中的一些术语迷惑,读起来会觉得有些别扭.尤其是在看到复位应答中的F和D设置,以及对应的etu的时候,会觉得有些复杂和难以理解. 其实 ...

  6. Android 对话框简介

    对话框(Dialog)是程序运行过程中弹出的窗口,Android中有好多种对话框,如警告对话框,进度对话框,列表对话框,单选对话框,日期选择对话框,时间选择对话框等: 下面用几个例子来演示一下各种对话 ...

  7. android 通过TimePickerDialog修改时间

    初学android,写了个修改时间的小程序,实现如下: 点击change按钮,弹出时间对话框: 然后点击Done,设置显示时间: 实现方式有两种, 一种是使用showDialog方法,不过此种方法已过 ...

  8. hdu5080:几何+polya计数(鞍山区域赛K题)

    /* 鞍山区域赛的K题..当时比赛都没来得及看(反正看了也不会) 学了polya定理之后就赶紧跑来补这个题.. 由于几何比较烂写了又丑又长的代码,还debug了很久.. 比较感动的是竟然1Y了.. * ...

  9. 基本NT式驱动代码结构

    #include <ntddk.h> void DriverUnload(IN PDRIVER_OBJECT DriverObject);NTSTATUS MyCreateClose(IN ...

  10. 泛型 Field 和 SetField 方法 (LINQ to DataSet)

    LINQ to DataSet 为 DataRow 类提供用于访问列值的扩展方法:Field 方法和 SetField 方法.这些方法使开发人员能够更轻松地访问列值,特别是 null 值.DataSe ...