最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
cocos2dx3.0屏蔽触摸
在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个地方实现:
设置触摸吞噬:
listener1->setSwallowTouches(true);这行代码的作用是设置不向下传递触摸事件。当设置为
true时,表示该触摸监听器会吞噬触摸事件,不会将事件传递给下层的节点;默认为false。选择添加触摸监听器的方式(二选一):
- 自由设置触摸优先级:
_eventDispatcher->addEventListenerWithFixedPriority(listener1, -128);这种方式可以自由设置触摸优先级,优先级的值可以是任意整数。这里将优先级设置为
-128,优先级越低,越先响应触摸事件。不过这种方式不绑定任何具体的节点。 - 绑定触摸监听器到精灵:
// _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, background);这行代码被注释掉了,它的作用是将触摸监听器绑定到指定的精灵(这里是
background),优先级为默认的0。
- 自由设置触摸优先级:
触摸优先级规则
需要注意的是,在cocos2dx3.0中,触摸优先级越低的节点越先被触摸。对于相同优先级的节点,后添加的节点先被触摸。
通过上述代码和分析,我们可以实现cocos2dx3.0中触摸事件的屏蔽和优先级控制。