cocos2dx:獲取子節點

在使用 Cocos2d-lua + ccs 進行開發的時候,獲取ccs拼接的ui界面中的子節點的方法爲 getChildByName(),例如:

parent:getChildByName("childName")

但是這個方法只能逐層獲取,比如下面這個節點層級:

node_main
    node_top
        img_bg_top
    node_center
        img_bg_center
        txt_desc

現在需要修改節點 txt_desc 的文本爲"Hello fightsyj",使用 getChildByName() 方法:

node_main:getChildByName("node_center"):getChildByName("txt_desc"):setString("Hello fightsyj")

如果想直接一步到位使用:

node_main:getChildByName("txt_desc"):setString("Hello fightsyj")

是無法獲取到節點 txt_desc 的,會報錯!

 

當然,想一步到位也是可以的!封裝一個工具函數去遞歸遍歷獲取目標子節點:

--[[ 
遞歸遍歷獲取目標子節點
@params parentNode(Node) 父節點
@params childName(string) 目標子節點名稱
@return targetNode(Node) 目標子節點
]]
Utils.getChildByNameEx = function(parentNode, childName)
    if not parentNode or not childName then
        return nil
    end
    if parentNode:getName() == childName then
        return parentNode
    end

    local children = parentNode:getChildren()
    for _, childNode in pairs(children) do
        local targetNode = Utils.getChildByNameEx(childNode, childName)
        if targetNode then
            return targetNode
        end
    end

    return nil
end

這樣就可以一步到位了:

Utils.getChildByNameEx(node_main, "txt_desc"):setString("Hello fightsyj")

ps:

  • 使用這種方式獲取子節點需要保證子節點名稱在這個父節點下唯一,否則不能保證獲取到你想要獲取的那一個子節點!

  • 使用這種方法的時候層級跨度不要太大,畢竟遞歸是很消耗性能的。最好和 getChildByName() 配合使用!

  • 熬了個夜,該如何拯救我的黑眼圈呢~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章