2013-02-22 118 views
0

爲我的投資組合工作一個小行星遊戲。使用以下代碼塊與錯誤進行遊戲。錯誤僅僅是迭代器不可忽略,但是我已經縮小了錯誤的範圍。我將談論後,我已經向你展示的代碼:迭代器錯誤內的向量迭代器

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無濟於事。

有沒有人有任何建議或幫助,他們可以提供?將不勝感激,一直在撓我的頭幾個小時!

+0

這將有助於代碼的可讀性顯著如果你命名了迭代它們是指,如後什麼'itAsteroid'和'itBullet'。 – Angew 2013-02-22 11:38:45

+0

@Angew我得到了很多哈哈,我現在不斷重寫代碼,所以在'iter'或'iterator'上鍵入bulletIter或asteroidIter:P最終版本將實現這些,謝謝。 和BoB嗯..我會盡快給你回覆,謝謝你的幫助 – DerryHolt 2013-02-22 11:44:28

回答

1

問題是,當你銷燬最後一顆小行星時,iterator將被設置爲bigAsteroids.end()(通過分配給erase()的結果)。然後內部while循環終止後,您解除引用iterator。過去的最終迭代器不能被解除引用。

你必須切換檢查的順序:

if (iterator != bigAsteroids.end() && *iterator != nullptr) 
+0

它不是最後一顆小行星。它可能是我拍攝的第一顆小行星。如果它是向量中最後一個小行星(如最後一個小行星),則錯誤會拋出。我不認爲我目前已經設法讓一個小行星射擊!哈哈 – DerryHolt 2013-02-22 11:45:47

+0

他的意思是:當你調用'bigAsteroids.erase(iterator)'時,'iterator'設置爲'bigAsteroids.end()'。 '* iterator!= nullptr'將會失敗,並且'iterator!= bigAsteroids.end()'將返回'false',所以切換條件的順序,並且你應該很好 – marsze 2013-02-22 11:48:05

+0

Ohhhhhhhh。我懂了。 我確實改變了它: 'if(itAsteroid!= bigAsteroids.end()){(* itAsteroid) - > Update(elapsedTime); }' 而這仍然導致錯誤。 但是,我再改線下: \t \t \t'如果(itAsteroid = bigAsteroids.end()&& * itAsteroid!= nullptr){++ itAsteroid;}' 它的確如你所說。我和你們做了什麼:P謝謝你們兩位! – DerryHolt 2013-02-22 11:53:34