cocos2dx3.0屏蔽触摸

2015年01月12日 15:20 0 点赞 0 评论 更新于 2025-11-21 14:05

在cocos2dx3.0中,如何屏蔽触摸呢?下面通过一个实战例子来详细说明。

代码示例

// 创建一个触摸监听
auto listener1 = EventListenerTouchOneByOne::create();
// 设置不向下传递触摸,true表示不传递,默认为false
listener1->setSwallowTouches(true);

// 触摸开始回调
listener1->onTouchBegan = [](Touch* touch, Event* event) {
CCLOG("touch menu");
return true;
};

// 触摸移动回调
listener1->onTouchMoved = [](Touch* touch, Event* event) {
// 可根据需求添加具体逻辑
};

// 触摸结束回调
listener1->onTouchEnded = [=](Touch* touch, Event* event) {
// 可根据需求添加具体逻辑
};

// 获取可见区域大小和原点
Size visibleSize = Director::getInstance()->getVisibleSize();
Point origin = Director::getInstance()->getVisibleOrigin();

// 这里添加了一个MenuItem,用来对比触摸优先级
auto continueItem = MenuItemImage::create(
"ContinueNormal.png",
"ContinueSelect.png",
CC_CALLBACK_1(MenuLayer::menuContinueCallback, this)
);
// 设置MenuItem的位置
continueItem->setPosition(Point(origin.x + visibleSize.width / 2,
origin.y + visibleSize.height / 2 + continueItem->getContentSize().height));

// 这里添加了一个背景,下面会用到
auto background = Sprite::create("background.png");
background->setTextureRect(CCRectMake(0, 0, visibleSize.width, visibleSize.height));
background->setContentSize(visibleSize);
background->setPosition(Point(visibleSize.width / 2 + origin.x, visibleSize.height / 2 + origin.y));
this->addChild(background, 0);

// 创建菜单
auto menu = Menu::create(continueItem, NULL);
menu->setPosition(Point::ZERO);
this->addChild(menu, 1);

// 重点就是这两行,下面会有详解
_eventDispatcher->addEventListenerWithFixedPriority(listener1, -128);
// _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, background);

关键实现点分析

上述代码中,关于cocos2dx3.0屏蔽触摸主要在以下3个地方实现:

  1. 设置触摸吞噬

    listener1->setSwallowTouches(true);
    

    这行代码的作用是设置不向下传递触摸事件。当设置为true时,表示该触摸监听器会吞噬触摸事件,不会将事件传递给下层的节点;默认为false

  2. 选择添加触摸监听器的方式(二选一)

    • 自由设置触摸优先级
      _eventDispatcher->addEventListenerWithFixedPriority(listener1, -128);
      

      这种方式可以自由设置触摸优先级,优先级的值可以是任意整数。这里将优先级设置为-128,优先级越低,越先响应触摸事件。不过这种方式不绑定任何具体的节点。

    • 绑定触摸监听器到精灵
      // _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, background);
      

      这行代码被注释掉了,它的作用是将触摸监听器绑定到指定的精灵(这里是background),优先级为默认的0

触摸优先级规则

需要注意的是,在cocos2dx3.0中,触摸优先级越低的节点越先被触摸。对于相同优先级的节点,后添加的节点先被触摸。

通过上述代码和分析,我们可以实现cocos2dx3.0中触摸事件的屏蔽和优先级控制。