最新文章
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
cocos2dx屏蔽列表的触摸
在 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 个地方实现:
禁止触摸向下传递
listener1->setSwallowTouches(true);这行代码的作用是设置禁止触摸事件向下传递。当设置为
true时,触摸事件不会再传递给其他节点。触摸优先级设置 以下两段代码二选一:
- 自由设置触摸优先级,但不绑定任何东西
_eventDispatcher->addEventListenerWithFixedPriority(listener1, -128);使用
addEventListenerWithFixedPriority方法可以自由设置触摸优先级。这里将优先级设置为-128,优先级越低,越先被触摸。
- 自由设置触摸优先级,但不绑定任何东西
- 设置触摸绑定到精灵,优先级为默认的 0
// _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, background);使用
addEventListenerWithSceneGraphPriority方法可以将触摸事件绑定到指定的精灵上,此时优先级为默认的 0。
触摸优先级规则
需要注意的是,触摸优先级越低的节点越先被触摸。对于相同优先级的节点,后添加的节点会先被触摸。
通过以上步骤,我们就可以在 Cocos2d-x 中实现触摸屏蔽的功能。