私が理解している限り、CCNode::getChildByTag
メソッドは直接の子のみを検索します。
しかし、すべての子孫階層でタグによって CCNode の子を再帰的に見つける方法はありますか?
CocosBuilder ccb ファイルから CCNode をロードしています。タグのみを知っているサブノードを取得したいと考えています (階層内の位置/レベルではありません)。
私が理解している限り、CCNode::getChildByTag
メソッドは直接の子のみを検索します。
しかし、すべての子孫階層でタグによって CCNode の子を再帰的に見つける方法はありますか?
CocosBuilder ccb ファイルから CCNode をロードしています。タグのみを知っているサブノードを取得したいと考えています (階層内の位置/レベルではありません)。
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 サブクラスに送信できます。
実際には、どのオブジェクトでもこのメッセージを送信できますが、ヘッダーをインポートしない場合、コンパイル中に警告が発生します。
以下は、再帰的な 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;
}
オプションとして、検索するノードのタイプを引数として渡すこともできます。