Cocos2d-x的UI树(2)
树的基本概念
树是由一系列节点组成的结构。在树中,除了根节点外,每个节点都有一个父节点;根节点没有父节点。除了叶子节点外,每个节点都有一个或多个子节点;叶子节点没有子节点。
Cocos2d-x中场景与树的关系
在Cocos2d-x里,每个场景都可以视为一棵独立的树。树中的每个节点都是Node子类的实例,根节点是Scene,它没有父节点(即其父节点为空)。
节点的添加操作
Node类的addChild方法用于将一个节点设置为该Node的子节点。每个Node都有一个Vector容器,用于存储其所有子节点。addChild方法会将指定节点添加到这个容器中,同时会设置子节点的tag、name(设置name时会计算其哈希值,用于后续搜索)、parent、_localZOrder和OrderOfArrival(当Z值相同时,用于排序)。
若当前Node处于显示状态,addChild方法会调用子节点的onEnter方法(该方法是每个Node显示时调用的回调方法),并根据具体情况调用子节点的onEnterTransitionDidFinish方法(该方法是每个Node入场动画结束时调用的回调方法),同时调用Node的updateCascadeColor(用于改变颜色)和updateCascadeOpacity(用于改变透明度)方法。
节点的查找操作
- getChildByTag方法:该方法会循环搜索
Node的所有子节点,根据指定的Tag找到目标子节点并返回。 - getChildByName方法:依据节点的
name和其对应的哈希值,查找所需的子节点。 - getChildren方法:返回
Node用于存储子节点的Vector容器。 - getChildrenCount方法:返回
Node的子节点数量。 - enumerateChildren方法:用于查找指定的子节点,并对找到的子节点执行回调函数。
节点的父节点操作
- setParent方法:用于设置
Node的父节点。 - getParent方法:返回
Node的父节点。
节点的移除操作
单个节点移除
- removeFromParent和removeFromParentAndCleanup方法:这两个方法会先判断
Node是否有父节点。若有父节点,则调用父节点的removeChild方法。 - removeChildByTag和removeChildByName方法:先根据
Tag或Name找到目标子节点,然后调用removeChild方法。 - removeChild方法:执行子节点的
onExitTransitionDidStart方法(该方法是每个Node出场动画开始时调用的回调方法)和onExit方法(该方法是每个Node出场时调用的回调方法)。如有必要,会停止子节点及其所有子节点的动作和调度器,并将子节点的父节点设置为null,最后从父节点的容器中删除该子节点。
全部节点移除
removeAllChildrenWithCleanup和removeAllChildren方法功能类似,其主要逻辑与removeChild方法相似,会对所有子节点执行退出回调函数,停止它们的动作,将父节点设置为空,并清空父节点的容器。