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);

我们很容易在 pushScenereplaceScene 中添加动画,可是 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();

posted @ 2016-07-22 11:08  脑浆炸裂的蜡笔  阅读(330)  评论(0编辑  收藏  举报