我正在尝试从我的子弹 vector 中删除“死”子弹。每帧,我都调用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);
}
}
}
我完全不正确地这样做吗?这是我第一次真正真正使用 vector ,而不仅仅是通过教程。如果我需要发布更多代码,请告诉我。在过去的几个小时中,我一直在努力进行这项工作,因此,我迫切希望将其付诸实践。
提前致谢!
最佳答案
只要i
th元素是列表中的最后一个元素,您就很容易进入 undefined 的行为。使用迭代器,并特别注意 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;
}
}
}