【问题标题】:Handling touches on child layer Cocos2d-x处理子层 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;
}

【问题讨论】:

    标签: c++ ios cocos2d-x event-listener


    【解决方案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 我明白了,也许我误解了你的问题,如果你的问题是你希望监听器仅在子层触摸时处理触摸事件,我将编辑我的答案
    • 是的,我想要那个
    • 我要试试这个:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多