处理子层 Cocos2d-x 的触摸
Posted
技术标签:
【中文标题】处理子层 Cocos2d-x 的触摸【英文标题】:Handling touches on child layer Cocos2d-x 【发布时间】:2015-06-17 09:50:11 【问题描述】:我在场景中添加了一个子层。我希望当我触摸此子层上的任何精灵时,触摸不会转到父层。 我为注册触摸事件编写了以下代码,但触摸仍会转到父层,而不是从父层返回。
void onEnter()
Layer::onEnter();
// Register Touch Event
auto dispatcher = Director::getInstance()->getEventDispatcher();
auto listener = EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = CC_CALLBACK_2(onTouchBegan, this);
listener->onTouchMoved = CC_CALLBACK_2(onTouchMoved, this);
listener->onTouchEnded = CC_CALLBACK_2(onTouchEnded, this);
dispatcher->addEventListenerWithSceneGraphpriority(listener, _cancelLayer);
这里 _cancelLayer 是我的子层的名称。请有人告诉这段代码有什么问题?我没有向父层注册任何触摸事件,但是当我触摸父层时,它仍然会进入触摸功能。
注意:子层的大小远小于父层。
在 touchBegin 中我什么也没做,我只是想用它来限制触摸移动到父层。
bool HeaderTableView::onTouchBegan(Touch *pTouch, Event *pEvent)
return true;
【问题讨论】:
【参考方案1】:TouchEventListener 会响应整个屏幕的触摸,所以你需要检查触摸是否在你想要的边界框内,like
bool HeaderTableView::onTouchBegan(Touch *pTouch, Event *pEvent)
Vec2 touchLocation = pTouch->getLocation(); // Get the touch position
touchLocation = _cancelLayer->getParent()->convertToNodeSpace(touchLocation);
Rect bBox = _cancelLayer->getBoundingBox();
return bBox.containsPoint(touchLocation);
【讨论】:
@Nargis 如果您在上面发布 onTouchBegan 代码会有所帮助。如果在 onTouchBegan 中移除了层,监听器也不会吞下触摸 @Nargis 我明白了,也许我误解了你的问题,如果你的问题是你希望监听器仅在子层触摸时处理触摸事件,我将编辑我的答案 是的,我想要那个 我要试试这个:)以上是关于处理子层 Cocos2d-x 的触摸的主要内容,如果未能解决你的问题,请参考以下文章