CCNode递归getChildByTag

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CCNode递归getChildByTag相关的知识,希望对你有一定的参考价值。

据我了解CCNode::getChildByTag方法只直接儿童中搜索。

但有什么办法递归找到标签CCNode的孩子在其所有的后代层次?

我从CocosBuilder CCB文件加载一个CCNode,我想找回子节点只知道自己的标签(不是他们的位置/在层级)

答案

一种方法 - 创建自己的方法。或用此方法CCNode创建类别。它看起来像这样的水木清华

- (CCNode*) getChildByTagRecursive:(int) tag
{
    CCNode* result = [self getChildByTag:tag];

    if( result == nil )
    {
        for(CCNode* child in [self children])
        {
            result = [child getChildByTagRecursive:tag];
            if( result != nil )
            {
                break;
            }
        }
    }

    return result;
}

这种方法添加到CCNode类。你可以创建任何你想要的文件类型,但我建议创建单独的文件,只在这个类别。在这种情况下,其中该头将被导入的任何其他对象,就能此消息发送到任何CCNode子类。

实际上,任何对象将能够发送该邮件,但它会导致无法进口头的情况下,在编译时警告。

另一答案

这里将是一个递归getChildByTag功能是Cocos2d-X 3.x的实现:

/** 
 * Recursively searches for a child node
 * @param typename T (optional): the type of the node searched for.
 * @param nodeTag: the tag of the node searched for.
 * @param parent: the initial parent node where the search should begin.
 */
template <typename T = cocos2d::Node*>
static inline T getChildByTagRecursively(const int nodeTag, cocos2d::Node* parent) {
    auto aNode = parent->getChildByTag(nodeTag);
    T nodeFound = dynamic_cast<T>(aNode);
    if (!nodeFound) {
        auto children = parent->getChildren();
        for (auto child : children)
        {
            nodeFound = getChildByTagRecursively<T>(nodeTag, child);
            if (nodeFound) break;
        }
    }
    return nodeFound;
}

作为一个选项,您还可以通过在搜索作为参数节点的类型。

以上是关于CCNode递归getChildByTag的主要内容,如果未能解决你的问题,请参考以下文章

cocos2dx中Node类getParent和getChildByTag()学习体会

用另一个 CCSprite/CCNode 剪辑 CCSprite/CCNode - Cocos2D

无法检测到 CCNode 上的触摸 - cocos2d v3.0

JavaScript - 代码片段,Snippets,Gist

CCNode 内部元素的定位

CCNode删除不起作用的Cocos2d