Cocos2dx3.0 疑难解答系列 (一) 代码里对Layer监听失效,此Layer层中有儿子layout加载了从cocostudio导出的ui层。

本文解决在Cocos2d-x中Layer层监听触摸事件失效的问题,通过调整Cocostudio UI层的交互设置,确保触摸事件能够正确地在Layer层和UI层之间进行分配。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码里对Layer监听失效,此Layer层中有儿子layout加载了从cocostudio导出的ui层。


下面是代码部分截取,(在Layer的init方法中)

auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(GameLayer::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(GameLayer::onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(GameLayer::onTouchEnded, this);
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);



Layout* layout = static_cast<Layout*>(GUIReader::getInstance()->widgetFromJsonFile("cashCountUI/cGameUI.ExportJson"));
this->addChild(layout);

从代码注册进事件分发中的函数可以看出,事件分发是以z轴为顺序分发的,所以新加载进来的ui层把事件给吃掉了,

所以在layer层监听触摸事件,才会失效。


但是一方面我们需要监听ui层,也想监听layer层,怎么办呢。

在cocostudio的ui编辑器中,取消掉层容器的交互选项(把勾反选),保留容器内控件的交互属性。再导出布局文件,覆盖掉之前的。

保持代码不变,运行程序,这样事件不会被吃掉(吞咽,我猜cocos机制里的读取布局文件并生成控件代码里就是因为层容器勾选了交互,才会设置了吞咽属性的setSwallowTouches(true),仅个人猜测而已,有兴趣的可以去翻查cocos源码)。


亲遇亲测。(大神们别取笑)。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值