删除Sprite时为什么不删除触摸侦听器?

时间:2016-01-19 11:35:51

标签: cocos2d-x cocos2d-x-3.0

我有以下代码用于检查精灵上的触摸:

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)
{
}

这似乎工作正常,但即使在精灵被破坏后,它仍会被触发(如果我点击精灵存在的最后一个地方),它会崩溃:

  

Thread1:EXC_BAD_ACCESS(code = 2,address = 0x7 ....)

在以下行:

    Rect rect = this->getBoundingBox();

现在我很清楚精灵被破坏了,因为我的析构函数被设置为在触发时显示一条日志消息(它确实如此):

SpriteBlock::~SpriteBlock() {
    CCLOG("Block destroyed"); 
}

那么这里有什么问题?为什么不用我的精灵摧毁听众?我通过执行以下操作来破坏我的精灵:

    mysprite->removeFromParent();

当我创建精灵时,我不存储任何引用。我只是将它添加到我的场景的主层,所以它不应该保留。我用它创建它:

SpriteBlock *block = SpriteBlock::create();

如何删除精灵时还要删除触控侦听器?

1 个答案:

答案 0 :(得分:0)

auto listener = cocos2d::EventListenerTouchOneByOne::create();

将其存储为SpriteBlock类中的变量。

然后在SpriteBlock析构函数中删除一个监听器。