Я делаю игру на C++ и SFML. У меня странная ошибка, всякий раз, когда у меня ровно 1 враг и 3 выстрела на экране, и пуля сталкивается с противником, игра падает. Ошибки я получаю:SFML weird shoot bug
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);
}
}
}
«врагов» и «выстрелов» являются векторы, которые я вставляю в каждые х секунд в основной цикл. Вот код, который:
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 выстрела, в противном случае это, кажется, работает хорошо.
EDIT: теперь игра замерзает, когда появляется первый враг. Вот обновленный код:
//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++;
}
}
}
Спасибо, но теперь у меня другая проблема. Посмотреть мой отредактированный пост – Wahoozel