cococos 2 d-xゲーム開発(十一)詳細シーン切り替え


転載を歓迎します:http://blog.csdn.net/fylz1125/article/details/8533970
ツッコミを入れて、ちょうど1時間書いて、このCSDNはどんな風を吸っても出せないことを知らないで、私は原稿を保存したと思って更新して、結局原稿を保存していません.拭いて...
cococos 2 d-xエンジンで実現されるシーン切替の特効は41個ありますが、ここでは挙げません.興味のある子供靴は自分でソースコードやグーグルを見て、大いに紹介しました.昨日は紅孩児のシーン切り替えを見て、詳しく書いて、コードは行ごとに注釈を書きました.ここではコードを詳しく説明したくなくて、流れだけに重点を置きます.
cococos 2 d-xの中のシーンは、2種類に分けられます
1.普通のシーンは、CCScene::create()が出てきます.このような特効はなく、運行するとそのまま出てきます.
2.トランジションシーンとは、特殊効果のあるシーンで、トランジションシーンと呼ばれています.このようなシーンを切り替えるときに特効があります.
一度書いたばかりで,本当に怠け者で詳しく書いた.直接結論を言います.
移行シーンとは、createから出てきたシーンをパッケージしたものです.
CCScene *scene = About::scene();
CCDirector::sharedDirector()->replaceScene(CCTransitionFade::create(1.2, scene));

特効とは,実質的にCCSceneを実現したonEnter()系列関数である.
CCTransitionFadeを例に挙げてみましょう.
class CC_DLL CCTransitionFade : public CCTransitionScene
{
protected:
    ccColor4B    m_tColor;

public:

    CCTransitionFade();
    virtual ~CCTransitionFade();
    
    /** creates the transition with a duration and with an RGB color
    * Example: FadeTransition::create(2, scene, ccc3(255,0,0); // red color
    */
    static CCTransitionFade* create(float duration,CCScene* scene, const ccColor3B& color);
    static CCTransitionFade* create(float duration,CCScene* scene);

    /** initializes the transition with a duration and with an RGB color */
    virtual bool initWithDuration(float t, CCScene*scene ,const ccColor3B& color);

    virtual bool initWithDuration(float t,CCScene* scene); 
    virtual void onEnter();//     
    virtual void onExit();
};

すべての移行シーンはCCTransitionSceneのサブクラスで、興味のあるのはソースコードや赤い子供のブログを見ることができます.
ここを見て、それはonEnterを実現しました.この関数の中でこそ実質的な遷移特効が実現され,一連の動作である.動作が終わったらfinish()を調整して、finishの中でまたsetNewScene関数を調整して、この関数は比較的に重要です:
void CCTransitionScene::setNewScene(float dt)
{    
    CC_UNUSED_PARAM(dt);
    // [self unschedule:_cmd]; 
    // "_cmd" is a local variable automatically defined in a method 
    // that contains the selector for the method
    this->unschedule(schedule_selector(CCTransitionScene::setNewScene));
    CCDirector *director = CCDirector::sharedDirector();
    // Before replacing, save the "send cleanup to scene"
    m_bIsSendCleanupToScene = director->isSendCleanupToScene();
    director->replaceScene(m_pInScene); //    ,       
    // enable events while transitions
    director->getTouchDispatcher()->setDispatchEvents(true);
    // issue #267
    m_pOutScene->setVisible(true);
}

移行特効は終わりました.
メインループがどのようにスケジューリングされるかを見る:setNextScene関数を直接見る
void CCDirector::setNextScene(void)
{
    //     ,          true,  false
    bool runningIsTransition = dynamic_cast<CCTransitionScene*>(m_pRunningScene) != NULL;
    //     ,           true,  false
    bool newIsTransition = dynamic_cast<CCTransitionScene*>(m_pNextScene) != NULL;

    // If it is not a transition, call onExit/cleanup
    //              ,         onExit cleanup
     if (! newIsTransition)
     {
         if (m_pRunningScene)//          
         {
             m_pRunningScene->onExitTransitionDidStart();
             m_pRunningScene->onExit();
         }
 
         // issue #709. the root node (scene) should receive the cleanup message too
         // otherwise it might be leaked.
         if (m_bSendCleanupToScene && m_pRunningScene)
         {
             m_pRunningScene->cleanup();
         }
     }

    if (m_pRunningScene)
    {
        m_pRunningScene->release();
    }
    //             
    m_pRunningScene = m_pNextScene;
    m_pNextScene->retain();
    m_pNextScene = NULL;

    //               ,         onEnter onEnterTransitionDidFinish
    if ((! runningIsTransition) && m_pRunningScene)
    {
        m_pRunningScene->onEnter();//     onEnter
        m_pRunningScene->onEnterTransitionDidFinish();
    }
}

最初は2つのブール変数が常にtrueではなく、シーンごとに特効を使用していても.理由は次のとおりです.
前の特殊効果シーンクラスのsetNewScene関数を見て、director->replaceScene(m_pInScene)という文があります.
これはあなたのシーン(CCScene::create()が出てきたもので、あなたが包装した特効シーンではありません)をシーンにロードするように設定しますが、このシーンは移行シーンではありません.ほほほ.
TestCppのTransitionsTest列をデバッグすると、この2つのブール変数は常にtrue、false、ほほほであることがわかります.
本質的には,1つの遷移シーンはCCSceneを実現したonEnter系列関数である.既存の列をまねて自分で書くことができます.へへ.
これだけ書いたのに、はっきり言ったかどうか分かりません.