代码里对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源码)。
亲遇亲测。(大神们别取笑)。