为我的作品集制作小行星游戏。使用以下代码块解决错误。错误只是迭代器不可延迟,但我已经缩小了错误范围。在我向您展示代码后,我将讨论这个问题:
void Game::Update()
{
if (elapsedTime > REFRESH_RATE)
{
player->Update(elapsedTime);
std::vector<Asteroid*>::iterator iterator= bigAsteroids.begin();
std::vector<Bullet*>::iterator iter = bullets.begin();
// *********************** //
while (iterator!= bigAsteroids.end())
{
if (*iterator != nullptr) // Checks to see if player is colliding with an asteroid and updates the asteroid
{
player->CheckCollisionsAsteroid( *iterator );
// *********************** // Checks to see if bullet is colliding with asteroid
while (iter != bullets.end())
{
if (*iter != nullptr)
{
if ((*iter)->CheckCollisionsAsteroid( **iterator ))
{
size_t i = iterator - bigAsteroids.begin();
iter = bullets.erase(iter);
iterator = bigAsteroids.erase(iterator);
printf("\nAsteroid destroyed at position %i", i);
}
else
{
++iter;
}
}
}
iter = bullets.begin(); // Reset the bullet iterator else we'd only get to check 1 asteroid
// *********************** //
if (*iterator != nullptr && iterator != bigAsteroids.end()) { (*iterator)->Update(elapsedTime); }
}
if (*iterator != nullptr && (iterator!= bigAsteroids.end()))
{++iterator;}
}
// *********************** //
Clock.Reset();
}
}
如果这一切看起来有点混乱,这里有一个简短的解释:
当迭代器通过每个小行星时,我检查玩家是否与每个小行星发生碰撞。目前这没有任何作用
然后我遍历我的子弹向量,检查每个子弹与当前的小行星。如果发生碰撞,我销毁并擦除子弹和小行星,并打印出被摧毁的小行星在向量中的位置。
完成后,我为下一个小行星重置了子弹迭代器。
我目前的主要问题是 (*iterator) <-- 小行星对更新的调用。
只有当我擦除小行星矢量中的最后一个物体时,才会出现这个问题。我知道擦除将迭代器返回到下一个对象 - 如果下一个对象不存在,则会引发错误(因为迭代器然后指向 nullptr,对吗?)。我正在检查 nullptr 无济于事..
有没有人可以提供任何建议或帮助?将不胜感激,我已经挠了好几个小时了!