CCNode getChildByTag แบบเรียกซ้ำ

เท่าที่ฉันเข้าใจวิธีการ CCNode::getChildByTag จะค้นหาเฉพาะในกลุ่มลูกโดยตรงเท่านั้น

แต่มีวิธีใดบ้างในการค้นหาลูกของ CCNode แบบวนซ้ำด้วยการแท็กในลำดับชั้นที่สืบทอดทั้งหมด

ฉันกำลังโหลด CCNode จากไฟล์ CocosBuilder ccb และฉันต้องการดึงข้อมูลโหนดย่อยที่รู้เฉพาะแท็กเท่านั้น (ไม่ใช่ตำแหน่ง/ระดับในลำดับชั้น)


person sdabet    schedule 09.11.2012    source แหล่งที่มา
comment
หากคุณต้องการ คุณสามารถใช้ getChildByTag แบบเรียกซ้ำที่เข้าชมลำดับชั้นทั้งหมดได้อย่างง่ายดาย   -  person sergio    schedule 09.11.2012


คำตอบ (2)


วิธีหนึ่ง - เพื่อสร้างวิธีการของคุณเอง หรือสร้างหมวดหมู่สำหรับ 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 ใดๆ ได้

จริงๆ แล้ว วัตถุใดๆ ก็ตามจะสามารถส่งข้อความนี้ได้ แต่จะทำให้เกิดคำเตือนระหว่างการคอมไพล์ ในกรณีที่ไม่ได้นำเข้าส่วนหัว

person Morion    schedule 09.11.2012
comment
คุณไม่ได้เรียกมันซ้ำ - person LearnCocos2D; 09.11.2012
comment
วิธีการนี้จะไปอยู่ในชั้นเรียนใด? - person sdabet; 09.11.2012
comment
โอวตกลง. จนถึงตอนนี้ฉันไม่เคยเป็นส่วนหัวของหมวดหมู่เลย ฉันไม่ใช่ผู้เชี่ยวชาญ Objective C จริงๆ :) ขอบคุณสำหรับทิป - person sdabet; 09.11.2012

นี่คือการใช้งาน cocos2d-x 3.x สำหรับฟังก์ชัน getChildByTag แบบเรียกซ้ำ:

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

ในฐานะตัวเลือก คุณสามารถส่งผ่านประเภทของโหนดที่ค้นหาเป็นอาร์กิวเมนต์ได้

person schmittsfn    schedule 30.07.2014