Director::setNextScene解析

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--工作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,767评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,982评论 19 139
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,290评论 0 16
  • 2017.5.24 星期三 晴 今天早上儿子又要背着吉他去上学了,说老师给他们机会跟舞蹈竞争,看着他满血复活...
    鑫隆妈妈阅读 204评论 0 1
  • “无语了……。”可可看着今天的热点作业,陷入沉思。 也是,今天《写手圈》《新媒体突围组》留的作业让她心塞。...
    云水禅心ZLM阅读 446评论 0 4