所有继承自Node类型的节点都支持使用getChildByName(name)和getChildByTag(tag)来获取当前节点的某个子节点。这两个函数已经能够满足我们大部分的需求
但有时候我们需要获取某个节点的子节点的子节点、甚至子节点的子节点的子节点、甚至
这样的需求是很常见的,而一层一层去get未免太繁琐。
对于Studio1x版本,2d-x提供了两个seek函数来帮我们解决这个问题:seekWidgetByName和seekWidgetByTag,放置在ui::UIHelper中,这两个函数会自动去搜索各个层,直到搜索到第一个匹配的对象。
但是UIHelper提供的两个函数中假定各个子节点类型为Widget,在20的机制下,Studio创建的节点可能同时包含Widget以及非Widget类型的节点,所以原来的方法就不适用新版本了。
不过虽然两个函数假定节点是Widget类型,但都只用到了node的接口,我们只要复制这两个函数,把其中的Widget改成Node,就能用了。
修改后的两个函数如下,照着修改UIHelper的内容。用js和lua的就你们自己写一个吧:
Node seekNodeByTag(Node root, int tag){
if (!root)
{
return nullptr;
}
if (root->getTag() == tag)
{
return root;
}
const auto& arrayRootChildren = root->getChildren();
ssize_t length = arrayRootChildrensize();
for (ssize_t i=0;i<length;i++)
{
Node child = dynamic_cast<Node>(arrayRootChildrenat(i));
if (child)
{
Node res = seekNodeByTag(child,tag);
if (res != nullptr)
{
return res;
}
}
}
return nullptr;
}
Node seekNodeByName(Node root, const std::string& name)
{
if (!root)
{
return nullptr;
}
if (root->getName() == name)
{
return root;
}
const auto& arrayRootChildren = root->getChildren();
for (auto& subWidget : arrayRootChildren)
{
Node child = dynamic_cast<Node>(subWidget);
if (child)
{
Node res = seekNodeByName(child,name);
if (res != nullptr)
{
return res;
}
}
}
return nullptr;
}
local cjson = require("cjson");
local file = ioopen(path,"r")
local json = file:read("a")
file:close()
youWantJson = cjsondecode(json)
首先导出的LUA文件是这样的
箭头指向的位置有个Create函数。就是调用这个函数进行创建。(至于这个参数是什么,后边会讲到)
首先,先将导出的这个文件require进来,进来之后呢,调用create方法,就会返回Cocos创建的Scene了~
代码如下:
1
local csLuaScene = require("Scenelua")create()
然后create 方法返回的结果是一个table,通过csLuaScene['root']来获得创建的Scene,接着replaceScene就可以了!对于“图层”和“节点”也是类似的 *** 作!
最后通过一系列的getChildByName 和 GetChildByTag 获取子节点进行 *** 作就可以了!
啊,对了,获取动画的方式和获取Scene的方式相似 csLuaScene['animation']!
接下来,create函数的那个参数是什么东西呢?
来看这个图 ,我给Button_1添加了一个叫做btn2的Click事件
生成LUA代码之后,能够发现有如下代码段:
这段代码,首先判断callBackProvider是否为空,然后呢,将他的返回值设置为Button_1的Click回调函数。
这样就很明白了。create时候需要传入的参数callBackProvider是一个函数,他的功能是根据传入的3个参数进行判断,最终返回一个函数最为Button(或者其他node)的回调函数!
callBackProvider的三个参数,分别是,当前LUA文件的路径,所绑定的Node(可以通过name或者tag来判断是哪个node),最后是回调函数的名字,通过这三个参数可以很容易的知道是哪个按钮的回调事件,从而返回该按钮所需要的回调函数。
所以,在create时候应该是这样的:
local callBackProvider = function ( path,node,funcName )
if path == "Scenelua" and node:getName()=="Button_1" and funcName =="bnt2" then
local function btnCallback( node,eventType )
--TODO
end
return btnCallback
end
end
local csLuaScene = require("Scenelua")create(callBackProvider)
也许大家看第一篇文章时候,注意到 我这里提示了一个错误,版本不兼容。是时候更新到35了!如果不想更新的话,就把35的UI的部分替换过来吧………
以上就是关于新手求助,x3.4怎么获取cocos2.15的按钮组件全部的内容,包括:新手求助,x3.4怎么获取cocos2.15的按钮组件、用lua语言访问一个URL,然后获取到相应的json数据、如何使用Cocos Studio导出的LUA文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)