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() 配合使用!

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

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