爲我的投資組合工作一個小行星遊戲。使用以下代碼塊與錯誤進行遊戲。錯誤僅僅是迭代器不可忽略,但是我已經縮小了錯誤的範圍。我將談論後,我已經向你展示的代碼:迭代器錯誤內的向量迭代器
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();
}
}
如果這一切看起來有點亂,這裏有一個簡要說明:
隨着迭代器通過每個小行星的,我檢查玩家是否與每個小行星碰撞。 目前這無能爲力
然後我遍歷我的子彈矢量,檢查每個子彈對當前的小行星。如果發生碰撞,我會摧毀子彈和小行星,並打印被毀壞的小行星在矢量中的位置。
一旦我完成了這一點,我重置子彈iter爲下一個小行星。
我目前的主要問題是通過(*迭代器)< - 小行星對更新的調用。
這個問題只會在我刪除小行星向量中的最後一個對象時出現。我知道擦除返回一個迭代器到下一個對象 - 如果下一個對象不存在,將拋出一個錯誤(因爲迭代器然後指向一個nullptr,是否正確?)。我正在檢查nullptr無濟於事。
有沒有人有任何建議或幫助,他們可以提供?將不勝感激,一直在撓我的頭幾個小時!
這將有助於代碼的可讀性顯著如果你命名了迭代它們是指,如後什麼'itAsteroid'和'itBullet'。 – Angew 2013-02-22 11:38:45
@Angew我得到了很多哈哈,我現在不斷重寫代碼,所以在'iter'或'iterator'上鍵入bulletIter或asteroidIter:P最終版本將實現這些,謝謝。 和BoB嗯..我會盡快給你回覆,謝謝你的幫助 – DerryHolt 2013-02-22 11:44:28