处理子层 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 的触摸的主要内容,如果未能解决你的问题,请参考以下文章

cocos2d 2.x如何吞下CCMenuItem的触摸

cocos2d-x ios游戏开发初认识 触摸事件与碰撞检測

cocos2d-x 过滤颜色

cocos2d 3.x 如何处理精灵外部的触摸

cocos2d-x的图片资源怎么加密?

cocos2d-x 中如何 实时 获得一个精灵坐标~~~