Я делаю игру на C++ и SFML. У меня странный баг, когда у меня на экране ровно 1 враг и 3 выстрела и пуля сталкивается с врагом, игра вылетает. Ошибка, которую я получаю:
Expression: vector subscript out of range
Вот как я проверяю столкновение между выстрелами и врагами:
for (int i = 0; i < enemies.size(); i++)
{
for (int s = 0; s < shots.size(); s++) {
if (Collision::PixelPerfectTest(enemies[i].getSprite(), shots[s].getSprite())) {
enemies[i].setHealth(enemies[i].getHealth() - player.getDamage());
if (enemies[i].getHealth() <= 0) {
enemies.erase(enemies.begin() + i);
}
shots.erase(shots.begin() + s);
}
}
}
«враги» и «выстрелы» — это векторы, которые я вставляю каждые x секунд в основном цикле. Вот код для этого:
if (enemySpawner.getElapsedTime().asSeconds() >= 1.5f) {
enemies.push_back(Enemy(spriteManager.enemySprite));
std::cout << enemies.size() << " enemies" << std::endl;
enemySpawner.restart();
}
if (shotSpawner.getElapsedTime().asSeconds() >= 0.3f && sf::Mouse::isButtonPressed(sf::Mouse::Left)) {
shots.push_back(Shot(spriteManager.shotSprite, player.getPosition(), *window));
std::cout << shots.size() << " shots" << std::endl;
shotSpawner.restart();
}
Как я уже сказал, это происходит только тогда, когда у меня есть 1 враг и 3 выстрела, в остальном вроде работает нормально.
РЕДАКТИРОВАТЬ: Теперь игра зависает при появлении первого врага. Вот обновленный код:
//Shot vs enemy
for (auto eit = enemies.begin(); eit != enemies.end();)
{
for (auto sit = shots.begin(); sit != shots.end();) {
if (Collision::PixelPerfectTest((*eit).getSprite(), (*sit).getSprite())) {
(*eit).setHealth((*eit).getHealth() - player.getDamage());
if ((*eit).getHealth() <= 0) {
enemies.erase(eit);
shots.erase(sit);
}
shots.erase(sit);
eit = eit++;
sit = sit++;
}
}
}