cocos2d-x 禁用触摸(如何快速屏蔽触摸)Cocos2d-x从3.0版本以来,触摸机制有所改变,虽然实现的道理没有变,不过我今天还是写出这篇文章,就当是简单的复习一下3.0的事件分发机制吧,同时把自己在研究的过程中遇到的问题分享出来。这里采用的方法是最简单,最直接的方法,整体的思路是这样的。设置触摸监听器吞噬触摸,然后在回调函数onTouchBegan中返回true,同时确保这个层的触摸优先级大于你要屏蔽的层的优先级。也许这种方法不能满足你得需求,那就请自行研究或者看下其他博客,或者给我留言共同探讨吧。在实现中我们肯定会遇到的就是屏蔽菜单,让菜单变的不可点击,那我就写一个简单的场景,里边加入菜单,然后加入一个层来屏蔽掉下层的触摸。
- bool CreateGame::init()
- {
- if(!Layer::init())
- return false;
- //UI
- auto size = Director::getInstance()->getWinSize();
- Vector<MenuItem *> itemVector;
- for(int i=1;i<4;i++)
- {
- auto item = MenuItemImage::create("no_people.png","people.png");
- item->setTag(i);
- itemVector.pushBack(item);
- }
- auto menu1 = Menu::createWithArray(itemVector);
- menu1->alignItemsHorizontallyWithPadding(10);
- menu1->setPositionY(size.height*0.75);
- this->addChild(menu1);
- auto swallowTouch = SwallowTouch::create();
- this->addChild(swallowTouch);
- return true;
- }
- bool SwallowTouch::init()
- {
- if(!LayerColor::initWithColor(Color4B(100,100,100,100)))
- return false;
- auto label = Label::createWithTTF("touch!","fonts/Marker Felt.ttf",32);
- label->setPosition(Point(350,800));
- this->addChild(label);
- auto callback = [](Touch * ,Event *)
- {
- return true;
- };
- auto listener = EventListenerTouchOneByOne::create();
- listener->onTouchBegan = callback;
- listener->setSwallowTouches(true);
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,this);
- //_eventDispatcher->addEventListenerWithFixedPriority(listener,-1);
- return true;
- }
然后来看第二种方法,addEventListenerWithFixedPriority函数的调用没有去绑定一个node,这个时候它的优先级就是通过第二个参数去传递的,我们通过改变这个优先级可以看下最后的效果,如果我设置为-1是可以成功屏蔽下层的菜单点击的,如果设置为0,那么程序运行会报错,如果设置为1,是屏蔽不掉下层的触摸的。这是因为0这个优先级是被占用了得,我们设置优先级不能设置为0,而要想屏蔽菜单的点击功能,必须设置优先级小于0,以下是这三个值的效果。
因为没有绑定那个LayerColor,所以是没有那个灰度的效果的。如果我只是要屏蔽下层按钮的点击,大可以将代码写到一个类中去完成,其实你也看到了,listener的作用就是事件监听,你可以给它绑定一个node,这个时候它的优先级就是node的显示优先级了,如果是手动设置优先级,不要设置为0的优先级就好了,这个时候当触摸分发的时候,会根据优先级关系来决定listener是否能接受的到触摸,写到一个类中的代码如下:
- bool CreateGame::init()
- {
- if(!Layer::init())
- return false;
- //UI
- auto size = Director::getInstance()->getWinSize();
- Vector<MenuItem *> itemVector;
- for(int i=1;i<4;i++)
- {
- auto item = MenuItemImage::create("no_people.png","people.png");
- item->setTag(i);
- itemVector.pushBack(item);
- }
- auto menu1 = Menu::createWithArray(itemVector);
- menu1->alignItemsHorizontallyWithPadding(10);
- //设置菜单为不可点击
- //menu1->setEnabled(false);
- menu1->setPositionY(size.height*0.75);
- auto item = (MenuItem *)menu1->getChildByTag(1);
- item->selected();
- this->addChild(menu1);
- auto layer = LayerColor::create(Color4B(100,100,100,100));
- auto callback = [](Touch * ,Event *)
- {
- return true;
- };
- auto listener = EventListenerTouchOneByOne::create();
- listener->onTouchBegan = callback;
- listener->setSwallowTouches(true);
- _eventDispatcher->addEventListenerWithSceneGraphPriority(listener,layer);
- //_eventDispatcher->addEventListenerWithFixedPriority(listener,-1);
- this->addChild(layer);
- return true;
- }