我正在尝试制作简单的游戏,但遇到了小问题。所以我有两个指针 vector 。 一种用于子弹,一种用于敌方单位。 首先,我尝试迭代所有子弹,然后在第二个循环中迭代敌人,当我发现碰撞时,我删除敌方单位和子弹,但是删除子弹会破坏我的游戏,所以我发现我不应该从 vector 中删除它仍在第一个循环中迭代。
我的第二个IDE是这样的:
std::vector<Bullet*>::iterator remove = std::remove_if(bullets.begin(), bullets.end(),
[&](Bullet* x)
{
for (std::vector<EnemyUnit*>::iterator it = enemyUnits.begin(); it != enemyUnits.end(); ++it)
{
if (x->collision->CheckCollision((*it)->collision))
{
enemyUnits.erase(it);
return true;
}
else
{
return false;
}
}
});
bullets.erase(remove, bullets.end());
所以它似乎在某种程度上起作用,但我的子弹一次只能与一个敌人碰撞,而且似乎它没有检查所有敌人。例如,我发射了 5 颗子弹,首先它们只能与一个敌人发生碰撞,在一颗子弹杀死敌人后,其他子弹将能够与第二个敌人发生碰撞,依此类推。好像是这样的
for (std::vector<EnemyUnit*>::iterator it = enemyUnits.begin(); it != enemyUnits.end(); ++it)
没有发生并且只有一个敌人?是不是做法不对呢? 我需要使用指针和 vector ,因为它适合我的项目。
最佳答案
std::remove_if
的谓词无论如何,第一次检查后都会返回。
为了解决这个问题,谓词可以在发生冲突时返回,或者在无冲突时返回,例如
for (auto it = enemyUnits.begin(); it != enemyUnits.end(); ++it)
{
if (x->collision->CheckCollision((*it)->collision))
{
enemyUnits.erase(it);
return true;
}
}
return false;
这样,如果检测到碰撞,它将提前退出并返回 true。 如果没有与任何敌人发生碰撞,它将在循环后停止并返回 false。
关于c++ - 嵌套循环,从 vector 中删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66737158/