Cocos2d-x 3.0 场景切换
场景切换要用到导演类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 场景切换的更多相关文章
- Cocos2d-X研究之3.0 场景切换特效汇总
Cocos2d-X研究之3.0 场景切换特效汇总 2014-08-05 0个评论 来源:游戏编程 收藏 我要投稿 cocos2d-x 3.0中场景切换特效比较多,而且游戏开 ...
- cocos2d-x 3.0 场景切换特效汇总(转)
cocos2d-x 3.0中场景切换特效比较多,而且游戏开发中也经常需要用到这些特效,来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 场景切换用到导演类Directory,大多数用的都是替 ...
- cocos2d-x 3.0 场景切换特效汇总
cocos2d-x 3.0中场景切换特效比較多,并且游戏开发中也常常须要用到这些特效.来使场景切换时不至于那么干巴,遂这里汇总一下,开发中使用. 场景切换用到导演类Directory,大多数用的都是替 ...
- [cocos2d]场景切换以及切换进度显示
本文主要分两个部分叙述,第一是场景切换,第二是场景切换的进度显示. 一.场景切换 参考learn-iphone-and-ipad-cocos2d-game-development 第五章内容 coco ...
- Cocos2d-X3.0 刨根问底(九)----- 场景切换(TransitionScene)源码分析
上一章我们分析了Scene与Layer相关类的源码,对Cocos2d-x的场景有了初步了解,这章我们来分析一下场景变换TransitionScene源码. 直接看TransitionScene的定义 ...
- Cocos2d-X3.0 刨根问底(九)----- 场景切换(TransitionScene)源代码分析
上一章我们分析了Scene与Layer相关类的源代码,对Cocos2d-x的场景有了初步了解,这章我们来分析一下场景变换TransitionScene源代码. 直接看TransitionScene的定 ...
- cocos2d 场景切换和弹出场景、收回场景
场景弹出收回很简单 用以下代码在任意一个地方显示“设置场景”: [[CCDirector sharedDirector] pushScene:[Settings scene]]; 如果你身处“设置场景 ...
- 【Cocos2d-x 3.x】 场景切换生命周期、背景音乐播放和场景切换原理与源码分析
大部分游戏里有很多个场景,场景之间需要切换,有时候切换的时候会进行背景音乐的播放和停止,因此对这块内容进行了总结. 场景切换生命周期 场景切换用到的函数: bool Setting::init() { ...
- 8 cocos2dx加入场景切换效果,控制场景切换彻底完毕之后再运行动画
1 加入场景切换效果 供场景切换的类: CCTransitionJumpZoom CCTransitionProgressRadialCCW CCTransitionProgressRadial ...
随机推荐
- poj2932 Coneology (扫描线)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Coneology Time Limit: 5000MS Memory Lim ...
- Entity Framework With Mysql 之Code First
Entity Framework 4.0现在也可以支持Mysql数据库了,这篇文章将向你展示如何用Code First的方式来实现. 1.首先新建一个项目,在项目中用NuGet添加如下引用: 2.在w ...
- Okhttp3日志采集功能
原文地址以示尊重:http://www.jianshu.com/p/d836271b1ae4 日志采集是一个APP必备的功能,可以方便开发人员快速定位问题,解决问题,那么我们在使用okhttp的时候应 ...
- windows mongodb 安装
window平台一下所有命令 务必以管理员身份运行 且在window系统命令行下,如git bash不可以 具体以管理员身份运行的快捷键是 1. win+x 2. shift + a 设置文件存储目录 ...
- SqlServer2008 新功能:简单数据加密
一.首先要把密码字段改成 varbinary 类型. CREATE TABLE [dbo].[UserInfo]( [id] [int] IDENTITY(1,1) NOT NULL, [name] ...
- PYTHON线程知识再研习E---条件变量同步Condition
Python提供的Condition对象提供了对复杂线程同步问题的支持.Condition被称为条件变量,除了提供与Lock类似的 acquire和release方法外,还提供了wait和notify ...
- C 和 C++的 不同
转自: http://studytipsandtricks.blogspot.com/2012/05/15-most-important-differences-between-c.html Basi ...
- java开发经验分享(三)
三. 项目开发 1. 需求: 1) 需求最终需要开发人员在产品中实现,开发不合理的设计会浪费时间,开发技术无法实现的设计带来最大的痛苦:失败.所以,开发人员要重视需求以及需求评审,提出自己能够想到的所 ...
- back_inserter的用法
1,代码如下: #include<iostream> #include<list> #include<algorithm> #include<iterator ...
- javascript笔记5之流程控制语句
/* var box = 100; //单行语句 var age = 20; //另一条单行语句 { //用花括号包含的语句集合,叫做复合语句,单位一个 //一对花括号,表示一个复合语句,处理时候,可 ...