1

我正在尝试从我的子弹向量中删除“死”子弹。每一帧,我都调用 Bullet::update() 函数,如下所示:

    void Bullet::update()
{
    for(int i = 0; i != mAmmo.size(); i++)
    {
        if(mAmmo[i].sprite.getPosition().x > 700)
            mAmmo[i].mAlive = false;
        if(mAmmo[i].mAlive == false)
        {
// I get a Debug Assertion Failed at runtime from this piece of code
            mAmmo.erase(mAmmo.begin()+i);
        }

        if(mAmmo[i].mAlive == true)
        {
            mAmmo[i].sprite.move(mMovement);
        }

    }

}

我这样做完全不正确吗?这是我第一次真正使用向量,而不仅仅是遵循教程。如果我需要发布更多代码,请告诉我。在过去的几个小时里,我一直在研究这个,所以我有点绝望地想让它工作。

提前致谢!

4

1 回答 1

1

一旦ith 元素是列表中的最后一个元素,您就很容易陷入未定义的行为。使用迭代器,并特别注意 的返回值erase(),因为它会自动为您推进迭代器,因此您的循环不必这样做。

void Bullet::update()
{
    for (auto it = mAmmo.begin(); it != mAmmo.end();)
    {
        if(it->sprite.getPosition().x > 700)
            it->mAlive = false;

        if (!it->mAlive)
        {
            // erase and get next iterator
            it = mAmmo.erase(it);
        }
        else
        {   // move and increment
            it->sprite.move(mMovement);
            ++it;
        }
    }
}
于 2013-09-20T00:35:20.513 回答