中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》
  • 首頁 > 
  • 教程 > 
  • 開發技術 > 
  • cocos2dx中onExitTransitionDidStart、onExit和onEnter、onEnterTransitionDidFinish處理機制

cocos2dx中onExitTransitionDidStart、onExit和onEnter、onEnterTransitionDidFinish處理機制

發布時間:2020-07-04 09:04:45 來源:網絡 閱讀:885 作者:螞蟻雄心 欄目:開發技術

進入Node::addChildHelper定義發現如下代碼

if( _running )

    {

        child->onEnter();

        // prevent onEnterTransitionDidFinish to be called twice when a node is added in onEnter

        if (_isTransitionFinished) {

            child->onEnterTransitionDidFinish();

        }

    }

也就是說,只有父節點已經在running的情況下,添加子節點時才會調用子節點的onEnter,由此可見,在scene中的添加的子節點,如果scene沒有被渲染,那么之前在scene中添加的子節點(包括layer,sprite)時不會立刻調用子節點的onEnter。那么scene的onEnter()在什么時候調用呢?查看Director中的DrawScene()定義,發現如下代碼:

 /* to avoid flickr, nextScene MUST be here: after tick and before draw.

     XXX: Which bug is this one. It seems that it can't be reproduced with v0.9 */

    if (_nextScene)

    {

        setNextScene();

    }

查看setNextScene定義發現

void Director::setNextScene()

{

    bool runningIsTransition = dynamic_cast<TransitionScene*>(_runningScene) != nullptr;

    bool newIsTransition = dynamic_cast<TransitionScene*>(_nextScene) != nullptr;


    // If it is not a transition, call onExit/cleanup

     if (! newIsTransition)

     {

         if (_runningScene)

         {

             _runningScene->onExitTransitionDidStart();

             _runningScene->onExit();

         }

 

         // issue #709. the root node (scene) should receive the cleanup message too

         // otherwise it might be leaked.

         if (_sendCleanupToScene && _runningScene)

         {

             _runningScene->cleanup();

         }

     }


    if (_runningScene)

    {

        _runningScene->release();

    }

    _runningScene = _nextScene;

    _nextScene->retain();

    _nextScene = nullptr;


    if ((! runningIsTransition) && _runningScene)

    {

        _runningScene->onEnter();

        _runningScene->onEnterTransitionDidFinish();

    }

}

在場景類型不是TransitionScene類型時,當當前場景不為null時,先退出當前場景,先調用當前場景的onExitTransitionDidStart、onExit并釋放當前場景,接著講下一個場景賦值給當前場景_runningScene = _nextScene;接著調用當前場景的onEnter()、onEnterTransitionDidFinish(),進行自身以及已添加子節點的onEnter調用,每個節點會在自身的onEnter中設置_running = true;這樣后續在已有場景中添加子節點時,會直接調用子節點的onEnter。

在已渲染場景中,子節點動態從父類中移除時,會調用onExitTransitionDidStart以及onExit

void Node::detachChild(Node *child, ssize_t childIndex, bool doCleanup)

{

    // IMPORTANT:

    //  -1st do onExit

    //  -2nd cleanup

    if (_running)

    {

        child->onExitTransitionDidStart();

        child->onExit();

    }

    

#if CC_USE_PHYSICS

    child->removeFromPhysicsWorld();

#endif


    // If you don't do cleanup, the child's actions will not get removed and the

    // its scheduledSelectors_ dict will not get released!

    if (doCleanup)

    {

        child->cleanup();

    }


    // set parent nil at the end

    child->setParent(nullptr);


    _children.erase(childIndex);

}


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

南康市| 玉林市| 霍山县| 阳山县| 勐海县| 广水市| 界首市| 武强县| 万盛区| 武宁县| 平凉市| 嘉祥县| 孝义市| 郑州市| 陆良县| 凤山市| 新乡县| 宁明县| 屯留县| 磐安县| 沁阳市| 定陶县| 宁陵县| 渝中区| 犍为县| 莲花县| 泰来县| 深泽县| 宣威市| 胶州市| 外汇| 洪江市| 铁岭县| 台中县| 永仁县| 信丰县| 若羌县| 禹州市| 堆龙德庆县| 翁牛特旗| 石嘴山市|