getChildByTag rekursif CCNode

Sejauh yang saya pahami metode CCNode::getChildByTag hanya mencari di antara anak-anak langsung.

Tetapi apakah ada cara untuk menemukan anak CCNode dengan tag secara rekursif di semua hierarki turunannya?

Saya memuat CCNode dari file ccb CocosBuilder dan saya ingin mengambil subnode hanya dengan mengetahui tagnya (bukan posisi/levelnya dalam hierarki)


person sdabet    schedule 09.11.2012    source sumber
comment
jika Anda membutuhkannya, Anda dapat dengan mudah menerapkan getChildByTag rekursif yang mengunjungi seluruh hierarki.   -  person sergio    schedule 09.11.2012


Jawaban (2)


Salah satu caranya adalah dengan membuat metode Anda sendiri. Atau buat kategori untuk CCNode dengan metode ini. Ini akan terlihat seperti ini

- (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;
}

Tambahkan metode ini ke kategori CCNode. Anda dapat membuat kategori di file apa pun yang Anda inginkan tetapi saya sarankan untuk membuat file terpisah dengan kategori ini saja. Dalam hal ini objek lain dimana header ini akan diimpor, akan dapat mengirim pesan ini ke subkelas CCNode mana pun.

Sebenarnya, objek apa pun dapat mengirimkan pesan ini tetapi akan menimbulkan peringatan selama kompilasi jika header tidak diimpor.

person Morion    schedule 09.11.2012
comment
Anda tidak menyebutnya secara rekursif - person LearnCocos2D; 09.11.2012
comment
Di kelas mana metode ini akan digunakan? - person sdabet; 09.11.2012
comment
Oh oke. Saya belum pernah membuat header kategori sejauh ini, saya sebenarnya bukan master Objective C :). Terima kasih atas tipnya - person sdabet; 09.11.2012

Berikut adalah implementasi cocos2d-x 3.x untuk fungsi getChildByTag rekursif:

/** 
 * 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;
}

Sebagai opsi, Anda juga bisa meneruskan tipe node yang dicari sebagai argumen.

person schmittsfn    schedule 30.07.2014