美文网首页
Director::setNextScene解析

Director::setNextScene解析

作者: Aresga | 来源:发表于2015-03-27 16:03 被阅读0次

bool newIsTransition = dynamic_cast(_nextScene) != nullptr;

如果这个newIsTransition不是一个TransitionScene的话我们就调用_runningScene的onExit和onExiteTransitionDidStart2个函数,当前_runningScene退出了。

接下来_sendCleanupToScene这个变量实在PopScene和replaceScene时候被设置成ture的,所以当调用replasceScene时候会调用_runningScene->cleanup();这个cleanup是Node的方法。

下面说说cleanup方法:

for( const auto& child : _children )  child->cleanup();

他会递归的调用所有子节点的cleanup()方法。也就是当前层的所有子节点都会被cleanup一次。

cleanup开始时有个2个调用:下面2个方法都是Node成员方法

this->stopAllActions();

this->unscheduleAllCallbacks();

在调用stopAllactions时,由_actionManager->removeAllActionsFromTarget(this);

此时他会在Action中找到与当前this相关的Action,然后调用deleteHashElement方法。在deleteHashElement方法中会调用与此actionElement绑定的Node->release(),这个Node就是上面的this指针。然后free掉这个element。

到此可以说明个问题:那就是cocos2d中的Action是由自身执行这个action的Node对象自身管理的,在这个Node中有成员变量_actionManager它负责Action的管理。当切换场景的时候,由上面指出的只要这个Node在running中它就会被调用cleanup。

形如这样:auto node = Sprite::create(""); node->runAction( Action );时,node的refCount会+1,但是这个refCount在replaceScene时,会被自身的_actionManager查询到,并且会调用node->release()一次,所以动作引发的refCount++不用我们自己处理,引擎是通过刚才分析去使refCount--的。

继续说setNexScene下面做的事情:

接下来就是要处理新场景。

_runningScene = _nextScene; 

_runningScene->retain();

_runningScene->onEnter(); 

_runningScene->onEnterTransitionDidFinish();

到此整个setNextScene解析完毕

总结:setNextScene方法中最重要的就是_sendCleanupToScene这个变量控制的cleanup了。由cleanup清理掉所有场景及场景所有子节点。重要的就是使得引擎内部维护的Node的refCount--工作。

相关文章

  • Director::setNextScene解析

    bool newIsTransition = dynamic_cast(_nextScene) != nullpt...

  • cocosjs 暂停和继续游戏

    cc.director.pause() cc.director.resume()

  • Director总结

    一、感受 如果用一个词形容这一年的感受,那就是痛苦、无奈、奔溃、骄傲、自豪、可惜。因为这一年是将我自己完全打碎的一...

  • product Director

    product Director(上海黄浦区) Responsibilities - 负责现有产品的设计及优化 -...

  • Technical Director

    Technical Director(上海黄浦区) Responsibilities - 负责整个产品的架构设计和...

  • Project Director

    Project Director(上海黄浦区) Responsibilities - 负责部门内项目的管理执行工作...

  • cocos creator基础操作总结

    1.场景加载 cc.director.loadScene('场景名称');//场景跳转 cc.director.p...

  • cocos creator基础操作总结

    1.场景加载 cc.director.loadScene('场景名称');//场景跳转 cc.director.p...

  • cocos creator基本操作

    1.场景加载cc.director.loadScene('场景名称');//场景跳转cc.director.pre...

  • Cocos2d-x简单介绍

    Director(导演)控制、管理 Director 控制着整个游戏,在Cocos2d-x 3.x中,Direct...

网友评论

      本文标题:Director::setNextScene解析

      本文链接:https://www.haomeiwen.com/subject/ofrnxttx.html