为什么在移除 Sprite 时不移除触摸侦听器?
Why isn't touch listener removed when Sprite is removed?
我有以下代码用于检查精灵上的触摸:
void SpriteBlock::addEvents()
{
auto listener = cocos2d::EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = [&](cocos2d::Touch* touch, cocos2d::Event* event)
{
Vec2 p = touch->getLocation();
Rect rect = this->getBoundingBox();
if(rect.containsPoint(p))
{
return true; // to indicate that we have consumed it.
}
return false; // we did not consume this event, pass thru.
};
listener->onTouchEnded = [=](cocos2d::Touch* touch, cocos2d::Event* event)
{
SpriteBlock::touchEvent(touch);
};
cocos2d::Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(listener, 30);
}
void SpriteBlock::touchEvent(cocos2d::Touch* touch)
{
}
这似乎工作正常,但即使在 sprite 被销毁后,它仍然会被触发(如果我点击最后一个 sprite 存在的地方),它会崩溃:
Thread1: EXC_BAD_ACCESS (code=2, address=0x7....)
在以下行:
Rect rect = this->getBoundingBox();
现在我很清楚精灵已被销毁,因为我的析构函数设置为在触发时显示日志消息(确实如此):
SpriteBlock::~SpriteBlock() {
CCLOG("Block destroyed");
}
那么这里的问题是什么?为什么听众没有被我的精灵摧毁?我通过执行以下操作销毁我的精灵:
mysprite->removeFromParent();
创建精灵时,我不存储任何引用。我只是将它添加到场景的主层,所以它不应该保留。我使用以下方法创建它:
SpriteBlock *block = SpriteBlock::create();
如何确保在删除 sprite 时触摸侦听器也被删除?
auto listener = cocos2d::EventListenerTouchOneByOne::create();
将其作为变量存储在 SpriteBlock 中 class。
然后在 SpriteBlock 的析构函数中删除一个监听器。
我有以下代码用于检查精灵上的触摸:
void SpriteBlock::addEvents()
{
auto listener = cocos2d::EventListenerTouchOneByOne::create();
listener->setSwallowTouches(true);
listener->onTouchBegan = [&](cocos2d::Touch* touch, cocos2d::Event* event)
{
Vec2 p = touch->getLocation();
Rect rect = this->getBoundingBox();
if(rect.containsPoint(p))
{
return true; // to indicate that we have consumed it.
}
return false; // we did not consume this event, pass thru.
};
listener->onTouchEnded = [=](cocos2d::Touch* touch, cocos2d::Event* event)
{
SpriteBlock::touchEvent(touch);
};
cocos2d::Director::getInstance()->getEventDispatcher()->addEventListenerWithFixedPriority(listener, 30);
}
void SpriteBlock::touchEvent(cocos2d::Touch* touch)
{
}
这似乎工作正常,但即使在 sprite 被销毁后,它仍然会被触发(如果我点击最后一个 sprite 存在的地方),它会崩溃:
Thread1: EXC_BAD_ACCESS (code=2, address=0x7....)
在以下行:
Rect rect = this->getBoundingBox();
现在我很清楚精灵已被销毁,因为我的析构函数设置为在触发时显示日志消息(确实如此):
SpriteBlock::~SpriteBlock() {
CCLOG("Block destroyed");
}
那么这里的问题是什么?为什么听众没有被我的精灵摧毁?我通过执行以下操作销毁我的精灵:
mysprite->removeFromParent();
创建精灵时,我不存储任何引用。我只是将它添加到场景的主层,所以它不应该保留。我使用以下方法创建它:
SpriteBlock *block = SpriteBlock::create();
如何确保在删除 sprite 时触摸侦听器也被删除?
auto listener = cocos2d::EventListenerTouchOneByOne::create();
将其作为变量存储在 SpriteBlock 中 class。
然后在 SpriteBlock 的析构函数中删除一个监听器。