cocos2d-x 3.x 关于cocostudio的UI将事件吃掉,场景Layer无法响应手势的问题解决方法


cocostudio的UI编辑器真是个好东西,用的熟真是可以节省很多开发时间,把客户端程序员从无尽的需求变化中解脱出来~


最近使用cocostudio的UI编辑器,遇到了一个问题,就是希望在场景当中注册Touch事件实现手势功能的同时,还能够使用cocostudio的UI编辑器导出的Layout等界面,


之前在做UI的过程当中,其实有一个属性很关键,就是那个标有“交互”属性的checkbox,打钩,不打钩,这个看似不重要,其实这就是今天我写这篇文章的”金钥匙“!


我的UI一般是做成全屏的,这样比较方便

场景中注册了onTouchBegan等事件后,自从添加了Layout的UI后,就再也无法响应场景的onTouchBegan了,很奇怪,最后看到了一篇文章:


传送门:

http://www.cocoachina.com/bbs/read.php?tid=197606


嘿嘿,自从把所有”交互“全部取消(除了按钮)以后,就正常了,场景的事件又可以响应了。


那这个”交互“选项内部,到底隐藏着怎样的秘密呢?


Layout* ui = xxxx;

ui->setTouchEnabled(true);

其实”交互“就是设置的是TouchEnabled()这个函数,如果为false,这个Layout就不会注册TouchListener,


事件向下传递,主要看的是onTouchBegan函数,是否返回false,如果返回true,则会被截断,这样后面的Widget或者Layer就无法接受事件了。


因此,如果一个UI打开了这个setTouchEnabled(true); 它的 onTouchBegan 就会返回true,把这个事件吃掉


具体原理,可以参看CCEventDispatcher.cpp


void EventDispatcher::dispatchTouchEvent(EventTouch* event)
{

}


其中有一段代码:

                if (isClaimed && listener->_isRegistered && listener->_needSwallow)
                {
                    if (isNeedsMutableSet)
                    {
                        mutableTouchesIter = mutableTouches.erase(mutableTouchesIter);
                        isSwallowed = true;
                    }
                    return true;
                }
这个 isClaimed变量其实就是onTouchBegan的返回值,该单词意思为认领,一旦这个Touch事件被某个接受者认领以后,就会在mutableTouches中将其删除,因此就不会继续传递下去了。




你可能感兴趣的:(cocos2d-x 3.x 关于cocostudio的UI将事件吃掉,场景Layer无法响应手势的问题解决方法)