【发布时间】:2023-03-08 10:29:01
【问题描述】:
我正在用 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);
}
}
}
“enemies”和“shots”是我在主循环中每隔 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++;
}
}
}
【问题讨论】: