cocos2dx 3.0触摸优先级

2015年01月29日 13:28 0 点赞 0 评论 更新于 2025-11-21 15:42

在本教程中,我们将深入学习Cocos2d-x 3.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)
);
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);

代码解释

触摸监听器的创建与设置

  • EventListenerTouchOneByOne::create():创建一个单点触摸监听器。
  • listener1->setSwallowTouches(true):设置触摸事件是否向下传递。当设置为true时,触摸事件不会传递给下层的节点;默认为false

触摸回调函数

  • onTouchBegan:触摸开始时调用的回调函数。在这个函数中,我们使用CCLOG输出了一条日志,并返回true表示该触摸事件被处理。
  • onTouchMoved:触摸移动时调用的回调函数,这里暂时没有添加具体的处理逻辑。
  • onTouchEnded:触摸结束时调用的回调函数,同样暂时没有添加具体的处理逻辑。

节点的创建与添加

  • MenuItemImage:创建一个图片菜单项,用于对比触摸优先级。
  • Sprite:创建一个背景精灵,设置其纹理矩形、内容大小和位置,并添加到当前层中。
  • Menu:创建一个菜单,将菜单项添加到菜单中,并将菜单添加到当前层中。

事件分发器的使用

  • _eventDispatcher->addEventListenerWithFixedPriority(listener1, -128):将触摸监听器以固定优先级添加到事件分发器中。触摸优先级越低的节点越先被触摸。

触摸优先级规则

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

通过以上的代码示例和解释,相信大家对Cocos2d-x 3.0的触摸优先级机制有了更深入的理解。在实际开发中,可以根据具体需求合理设置触摸优先级,以实现不同的交互效果。

作者信息

feifeila

feifeila

共发布了 3994 篇文章