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

cocos2d-x3.6两层Layer触摸事件传递

2017-07-07 08:53 387 查看
这里有一点要注意,我这个GameScene本身是一个Layer,然后里面的GameOver页面又是一个Layer。就是一个场景里面有两个层。

前面我们在init()里面添加的触摸事件并不能解决这里的问题,GameOver层弹出来以后,点击屏幕,连连看里面的小图标还能被点中,会动的。看init()里面的触摸事件:
auto dispatcher = Director::getInstance()->getEventDispatcher();
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(GameScene::onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(GameScene::onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(GameScene::onTouchEnded, this);
listener->onTouchCancelled = CC_CALLBACK_2(GameScene::onTouchCancelled, this);
dispatcher->addEventListenerWithSceneGraphPriority(listener, this);


这是init()里面的触摸,可以看到设置了触摸事件吞噬,listener->setSwallowTouches(true),然并卵。为什么:

在一个场景里面,如果有多个层,所有的层都必需要注册了触控事件才能进行控制。可以看到这里只是注册了当前层。所以如果只有initi()里面的触摸函数设置,是不能满足需求的。我需要当GameOver层弹出来的时候,后面的层不能被点击。

所以我们的GameOver也需要注册触摸事件:
// Game Over层添加触摸事件
auto dispatcher = Director::getInstance()->getEventDispatcher();
auto listener = EventListenerTouchOneByOne::create();
// 吞掉触摸事件,即下面的层不会响应此次触摸
listener->setSwallowTouches(true);
// Lambda表达式实现触摸函数,空的,因为不需要做触摸实现
listener->onTouchBegan = [](Touch*touch, Event* event){return true;};
listener->onTouchMoved = [](Touch*touch, Event* event){};
listener->onTouchEnded = [](Touch*touch, Event* event){};
listener->onTouchCancelled = [](Touch*touch, Event* event){};
// 加到GameOver层
dispatcher->addEventListenerWithSceneGraphPriority(listener, layer);


最后一行:dispatcher->addEventListenerWithSceneGraphPriority(listener, layer); 

这就是给layer层注册触摸事件。

由于GameOver层不需要做什么触摸逻辑,仅仅是把这个事件吞掉,不再向下传递,所有我直接用了几个空的Lambda表达式来做了。

然后可以看到,达到效果了。

版权声明:本文为博主原创文章,转载请注明出处 http://blog.csdn.net/dawn_moon
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x