Cocos2d-x 3.x 层触摸优先级及屏蔽

2.x版本一般是以下方法设置

CCDirector::sharedDirector()->getTouchDispatcher()->addTargetDelegate(this, priority, true);

对象销毁的时候还需要执行下面的代码

CCDirector::sharedDirector()->removeDelegate(this);

3.x版本的触摸点击事件较之2.x版本有了很大的改动,直接与层的Z-Order相关,不需要再设优先级priority,Z-Order越大,则越先触发,越小则越晚触发。

//层 1
auto Layer1 = Layer::create();
addChild(Layer1, 10);

auto listener1 = EventListenerTouchOneByOne::create();
listener1->onTouchBegan = [this](Touch *touch, Event *event){
    log("touch layer 1");
    return true; 
};

Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener1, Layer1);

//层 2
auto Layer2 = Layer::create();
addChild(Layer2, 5);

auto listener2 = EventListenerTouchOneByOne::create();
listener2->onTouchBegan = [this](Touch *touch, Event *event){
    log("touch layer 2");
    return true;
};

Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener2, Layer2);

最后的输出是

touch layer 1
touch layer 2

如果想吞噬掉点击事件,不让它传递到下一层,就需要改成下面的代码

auto listener1 = EventListenerTouchOneByOne::create();
//这里设为true
listener1->setSwallowTouches(true);
listener1->onTouchBegan = [this](Touch *touch, Event *event){
    log("touch layer 1");
    return true; 
};

然后发现了一个问题,如果onTouchBegan返回的是false的话,即便是 setSwallowTouches(true) ,也不能吞噬掉点击,还是能点到下面的层。这个还没搞懂是为什么。

你可能感兴趣的:(Cocos2dx)