zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    ABS(引数と同じ大きさの正の数を返す)
    WRITE
    LEAVE TO LIST-PROCESSING
    SHIFT(文字列の指定位置数の移動)
    【EXCEL】SUMIF(条件を指定して数値を合計する)
    【EXCEL】SUMIFS(複数の条件を指定して数値を合計する)
    【財務会計】流動資産と固定資産の違いとは?ディズニーを例にわかりやすく解説
    【財務会計】償却 とは
    【財務会計】固定資産の除却と廃棄の違い
    尽力去做你力所能及的事
  • 原文地址:https://www.cnblogs.com/lalalabi/p/5694476.html
Copyright © 2011-2022 走看看