您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-x 3.0屏蔽下层触摸

2015-04-21 22:02 483 查看

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;
}

这里在最后添加了一个层,这个层就是用来屏蔽触摸的,大家要注意添加这个层的位置,这个层是最后添加进来的,也就是说它要显示的话是显示在最前边的,这个和接下来的屏蔽触摸有联系。以下是这个层的init函数。

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;
}
代码很简单,只是添加了一个事件监听器,设置这个事件监听器吞噬掉触摸,在onTouchBegan回调函数中返回了true。最主要的东西是将事件监听器添加到分发器中的代码,这里可以选择俩种方式来做,如果选择的是第一种,第二个参数是要求我们来将这个事件监听器和一个node绑定,什么是和node绑定,就是这个node对触摸的处理是和这个listener一样的,比如触摸的优先级,接受到触摸以后的处理代码,或者说这个listener来处理node接受到得触摸消息。这个时候Listener的优先级就是绑定的node的显示优先级,就是谁显示在场景的前面,谁先接受到触摸消息,所以在主场景的代码中,我们要把创建这个layer的代码放到后边,这样的话才会优先级高,才会首先收到触摸消息。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: