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

这里有一点要注意,我这个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.youkuaiyun.com/dawn_moon

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值