课程笔记 — UI树的构成

树是一堆节点的组合,每个节点(除了跟节点)都有一个父节点,跟节点没有父节点;每个节点(除了叶子节点)都有一个或多个子结点,叶子节点没有子结点。

Cocos2d-x中每个场景都可以看做是一棵独立的树,每个节点都是Node子类的实例化,跟节点是Scene,其父节点为空。

Node的addChild用于将一个节点设置为Node的子结点,每个Node都有一个Vector的容器用于存储子结点,addChild方法将一个节点加入Node的该容器中。同时设置子结点的tag、name(同时会计算出name的hash值用于搜索使用)、parent、_localZOrder、OrderOfArrival(用于在Z值相同的时候,排序使用)。若Node处于显示状态,则同时调用child的onEnter方法(该方法为每个Node被显示的时候调用的回调方法),并根据情况调用child的onEnterTransitionDidFinish(该方法为每个Node入场动画结束时调用的回调方法)、以及调用Node的updateCascadeColor(改变颜色)和updateCascadeOpacity(改变透明度)方法。

Node的getChildByTag方法,循环搜索Node的所有子节点,根据Tag,找到所要找的子结点并返回。getChildByName方法,根据name和name的hash值,找到所需要的子结点。getChildren方法,返回Node用于存储子结点的Vector容器。getChildrenCount方法返回子结点的数量。enumerateChildren方法用于找到child,并对child执行回调函数。

Node的setParent用于设置Node的父节点,getParent用于返回Node的父节点。

Node的removeFromParent、removeFromParentAndCleanup会判断是否有Node是否有父节点,如果有的话,会去调用父节点的removeChild方法。Node的removeChildByTag、removeChildByName会掉找到child,并调用removeChild方法。removeChild方法用于执行child的onExitTransitionDidStart(该方法为每个Node出场动画开始时调用的回调方法)、onExit(该方法为每个Node出场时调用的回调方法),如果有必要的话,停止child以及child的child们的动作和调度器,并将child的父节点设置为null,从父节点的容器中删除。removeAllChildrenWithCleanup和removeAllChildren相同,主体函数类似removeChild的功能,将所有的child执行退出的回调函数,停止动作,父节点设置为空并从清空父节点的容器。