1

私が理解している限り、CCNode::getChildByTagメソッドは直接の子のみを検索します。

しかし、すべての子孫階層でタグによって CCNode の子を再帰的に見つける方法はありますか?

CocosBuilder ccb ファイルから CCNode をロードしています。タグのみを知っているサブノードを取得したいと考えています (階層内の位置/レベルではありません)。

4

2 に答える 2

5

1 つの方法 - 独自のメソッドを作成します。または、このメソッドで 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 サブクラスに送信できます。

実際には、どのオブジェクトでもこのメッセージを送信できますが、ヘッダーをインポートしない場合、コンパイル中に警告が発生します。

于 2012-11-09T14:02:52.053 に答える
0

以下は、再帰的な 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;
}

オプションとして、検索するノードのタイプを引数として渡すこともできます。

于 2014-07-30T09:30:56.577 に答える