在Cocos2d-x 3.0中处理LayerColors上的单击

时间:2014-04-23 22:20:42

标签: touch cocos2d-x

我有一个名为MyLayer的LayerColor子类。我在场景中有一些MyLayer实例。我想点击每个实例并为该实例做一些事情。

我设置了这样的触摸处理:

    EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
    listener->setSwallowTouches(true);
    listener->onTouchBegan = CC_CALLBACK_2(MyLayer::touchBegan, this);
    listener->onTouchEnded = CC_CALLBACK_2(MyLayer::touchEnded, this);
    Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, this);

然后我用这些方法处理:

    bool MyLayer::touchBegan(Touch *touch, Event *event) {
        Point touchPoint = this->convertToNodeSpace(touch->getLocation());
        return this->boundingBox().containsPoint(touchPoint);
    }

    void MyLayer::touchEnded(Touch *touch, Event *event) {

    }

问题是没有正确调用touchEnded。它适用于一个MyLayer实例,但其他实例永远不会接收到触摸。

我记录了边界框和触摸点。对于没有接触到触摸的MyLayer实例,触摸点和边界框是混合的":将在边界框中的触摸点传递给touchBegan以用于不同的边界框。因此touchBegan返回false。

我正在使用Cocos2d-x-3.0rc1。任何帮助表示赞赏!

此外,其他LayerColor子类的触摸处理与上面使用的相同代码一起工作正常。但是,当我有多个MyLayer实例时,我的场景中只有这些子类的单个实例。

1 个答案:

答案 0 :(得分:1)

我认为最好的想法是重新安排你的代码,考虑一下:

auto listener = cocos2d::EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);

listener->onTouchBegan = [&](cocos2d::Touch* touch, cocos2d::Event* event)
{
    return true;
};

listener->onTouchEnded = [=](cocos2d::Touch* touch, cocos2d::Event* event)
{
    MyLayer::touchEvent(touch);
};

void MyLayer::touchEvent(cocos2d::Touch* touch)
{
    cocos2d::Point p = touch->getLocation();
    cocos2d::Rect rect = this->getBoundingBox();

    if(rect.containsPoint(p))
    {
      // you touched it, now do something
    }
}