Я делаю 2D-игру на C ++ и пытаюсь стрелять врагов. Когда пуля сталкивается с первым оказанным врагом, то враг хорошо убивается и удаляется из enemys
вектор. Однако после того, как первый враг был убит, другие враги больше не умирают.
Здесь проверка выполняется в функции обновления.
size = enemys.size();
for (int i = 0; i<size; i++)
{
double x = enemys[i].getEnemyX();
double y = enemys[i].getEnemyY();
bool isShot = enemyShot(x,y);
if(isShot == true){
enemys.erase(enemys.begin()+i);
size = size - 1;
}
}
Это функция врага.
bool GameActivity::enemyShot(double enemyX, double enemyY)
{
int size = bullets.size();
for (int i = 0; i<size; i++)
{
double x = bullets[i].getX();
double y = bullets[i].getY();
if (x >= enemyX-5.0 && x <= enemyX+5.0 && y >= enemyY-5.0 && y <= enemyY + 5.0){
return true;
}
else{
return false;
}
}
}
Проблема в том, что ваш вектор врагов обновляется после каждого стирания — таким образом, текущий индекс больше не является правильным.
Лучший способ перебрать вектор врага — начать с конца вектора врага. Таким образом, когда вы удаляете элемент, индекс по-прежнему корректен:
for (size_t i = enemys.end (); i> 0; --i) {
double x = enemys[i].getEnemyX();
double y = enemys[i].getEnemyY();
bool isShot = enemyShot(x,y);
if(isShot == true){
enemys.erase(enemys.begin()+i);
}
}