我有一个名为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实例时,我的场景中只有这些子类的单个实例。
答案 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
}
}