Cocos2d-x 3.0 场景切换
场景切换要用到导演类Director,一般有两种方式,大多数是用替换场景(replaceScene),也可以用进栈(pushScene)出栈(popScene)的方式进行场景的替换。
场景切换代码:
1 auto scene = HelloWorld::createScene(); // 创建待切换的场景 2 auto transition = TransitionZoomFlipY::create(1.0f, scene); // 给场景包装动画特效 3 Director::getInstance()->replaceScene(transition); //运用导演类来进行切换场景
场景切换特效:
1 // 慢慢淡化到另一场景 2 TransitionCrossFade::create(float t, cocos2d::Scene* scene); 3 4 // 本场景变暗消失后另一场景慢慢出现 5 TransitionFade::create(float duration, cocos2d::Scene* scene); 6 7 // 本场景右上角到左下角方块消失到另一场景 8 TransitionFadeBL::create(float t, cocos2d::Scene* scene); 9 10 //本场景从上到下横条消失到另一场景 11 TransitionFadeDown::create(float t, cocos2d::Scene* scene); 12 13 //本场景左下角到右上角方块消失到另一场景 14 TransitionFadeTR::create(float t, cocos2d::Scene* scene); 15 16 //本场景从下到上横条消失到另一场景 17 TransitionFadeUp::create(float t, cocos2d::Scene* scene); 18 19 //本场景翻转消失到另一场景(斜上方) 20 TransitionFlipAngular::create(float t, cocos2d::Scene* s, cocos2d::TransitionScene::Orientation o); 21 22 //本场景翻转消失到另一场景(X轴) 23 TransitionFlipX::create(float t, cocos2d::Scene* s, cocos2d::TransitionScene::Orientation o); 24 25 //本场景翻转消失到另一场景(Y轴) 26 TransitionFlipY::create(float t, cocos2d::Scene* s); 27 28 //本场景翻转消失到另一场景(斜上方) 29 TransitionZoomFlipAngular::create(float t, cocos2d::Scene* s, cocos2d::TransitionScene::Orientation o); 30 31 //本场景翻转消失到另一场景(X轴) 32 TransitionZoomFlipX::create(float t, cocos2d::Scene* s, cocos2d::TransitionScene::Orientation o); 33 34 //本场景翻转消失到另一场景(Y轴) 35 TransitionZoomFlipY::create(float t, cocos2d::Scene* s, cocos2d::TransitionScene::Orientation o); 36 37 //另一场景由整体从下面出现 38 TransitionMoveInB::create(float t, cocos2d::Scene* scene); 39 40 //另一场景由整体从左面出现 41 TransitionMoveInL::create(float t, cocos2d::Scene* scene); 42 43 //另一场景由整体从上面出现 44 TransitionMoveInT::create(float t, cocos2d::Scene* scene); 45 46 //另一场景由整体从右面出现 47 TransitionMoveInR::create(float t, cocos2d::Scene* scene); 48 49 //本场景从左到右消失同时另一场景出现 50 TransitionProgressHorizontal::create(float t, cocos2d::Scene* scene); 51 52 //本场景从中间到四周消失同时另一场景出现 53 TransitionProgressInOut::create(float t, cocos2d::Scene* scene); 54 55 //本场景从四周到中间消失同时另一场景出现 56 TransitionProgressOutIn::create(float t, cocos2d::Scene* scene); 57 58 //本场景逆时针消失到另一场景 59 TransitionProgressRadialCCW::create(float t, cocos2d::Scene* scene); 60 61 //本场景顺时针消失到另一场景 62 TransitionProgressRadialCW::create(float t, cocos2d::Scene* scene); 63 64 //本场景从上到下消失同时另一场景出现 65 TransitionProgressVertical::create(float t, cocos2d::Scene* scene); 66 67 //本场景向上滑动到另一场景 68 TransitionSlideInB::create(float t, cocos2d::Scene* scene); 69 70 //本场景向右滑动到另一场景 71 TransitionSlideInL::create(float t, cocos2d::Scene* scene); 72 73 //本场景向左滑动到另一场景 74 TransitionSlideInR::create(float t, cocos2d::Scene* scene); 75 76 //本场景向下滑动到另一场景 77 TransitionSlideInT::create(float t, cocos2d::Scene* scene); 78 79 //本场景三矩形上下消失后另一场景三矩形上下出现 80 TransitionSplitCols::create(float t, cocos2d::Scene* scene); 81 82 //本场景三矩形左右消失后另一场景三矩形左右出现 83 TransitionSplitRows::create(float t, cocos2d::Scene* scene); 84 85 //本场景小方块消失到另一场景 86 TransitionTurnOffTiles::create(float t, cocos2d::Scene* scene); 87 88 //翻页切换,bool为true是向前翻。 89 TransitionPageTurn::create(float t, cocos2d::Scene* scene, bool backwards); 90 91 //本场景跳动消失后另一场景跳动出现 92 TransitionJumpZoom::create(float t, cocos2d::Scene* scene); 93 94 //本场景旋转消失后另一场景旋转出现 95 TransitionRotoZoom::create(float t, cocos2d::Scene* scene); 96 97 //本场景缩小切换到另一场景放大 98 TransitionShrinkGrow::create(float t, cocos2d::Scene* scene);
我们很容易在 pushScene 跟 replaceScene 中添加动画,可是 popScene 没有提供动画,解决方法就是(如果使用VS打开的话)在右边栏的解决方案搜索框中搜索 CCDirector.h , 找到 void popScene(); 在这个函数下面添加以下代码:
1 void Director::popScene(const std::function<void(Scene* &)>& callback) 2 { 3 CCASSERT(_runningScene != nullptr, "running scene should not null"); 4 5 _scenesStack.popBack(); 6 ssize_t c = _scenesStack.size(); 7 8 if (c == 0) 9 { 10 end(); 11 } 12 else 13 { 14 _sendCleanupToScene = true; 15 _nextScene = _scenesStack.at(c - 1); 16 if(callback) 17 callback(_nextScene); 18 } 19 }
在使用的时候:
1 auto callback = [](Scene*& scene){scene = TransitionJumpZoom::create(1.0f, scene);}; 2 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();