新手求助,x3.4怎么获取cocos2.15的按钮组件

新手求助,x3.4怎么获取cocos2.15的按钮组件,第1张

所有继承自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文件等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/10159495.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存