cocos2dx屏蔽列表的触摸

2015年01月18日 10:33 0 点赞 0 评论 更新于 2025-11-21 14:40

在 Cocos2d-x 开发中,如何实现触摸屏蔽是一个常见的问题。下面,我将通过一个实战例子详细说明。

代码实现

// 创建一个触摸监听
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);

触摸屏蔽的主要实现点

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

  1. 禁止触摸向下传递

    listener1->setSwallowTouches(true);
    

    这行代码的作用是设置禁止触摸事件向下传递。当设置为 true 时,触摸事件不会再传递给其他节点。

  2. 触摸优先级设置 以下两段代码二选一:

    • 自由设置触摸优先级,但不绑定任何东西
      _eventDispatcher->addEventListenerWithFixedPriority(listener1, -128);
      

      使用 addEventListenerWithFixedPriority 方法可以自由设置触摸优先级。这里将优先级设置为 -128,优先级越低,越先被触摸。

  • 设置触摸绑定到精灵,优先级为默认的 0
    // _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, background);
    

    使用 addEventListenerWithSceneGraphPriority 方法可以将触摸事件绑定到指定的精灵上,此时优先级为默认的 0。

触摸优先级规则

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

通过以上步骤,我们就可以在 Cocos2d-x 中实现触摸屏蔽的功能。