2017-04-20 85 views
1

我有一個非常困難的時間編程一個班的太空入侵者。我應該使用一個列表來存儲我的「導彈」和一個列表來存儲我的「外星人」。我按空格鍵加載一個新的外星人,當兩個聯繫人,我試圖刪除他們兩個,我甚至無法通過刪除「外星人」。當發射多枚導彈時,我會遇到各種各樣的錯誤,如果此功能被註釋掉,導彈就能正常工作。我被迫將一個導彈列表傳遞給另一個已經包含外星人列表並刪除兩個列表的類。如何在聯繫時從兩個列表中刪除元素?

這裏是有問題的代碼:

bool AlienMgr::checkHit(PlayerMgr& playerMgr) 
{ 

    bool hit = false; // If the player hits an alien, switches to true and is returned. 
    list<Missile*>::iterator missileIter; 
    list<Missile*> missileList = playerMgr.getMissiles(); 
    int missileCount; 

    FloatRect missileBounds; 
    FloatRect alienBounds; 

    iter = myAliens.begin(); 

    while (!myAliens.empty() && iter != myAliens.end()) 
    { 
     alienBounds = (*iter)->getGlobalBounds(); 

     if (!missileList.empty() && !hit) 
     { 

      for (missileIter = missileList.begin(); missileIter != missileList.end() && !hit; missileIter++) 
      { 
       missileBounds = (*missileIter)->getMissileBounds(); 

       if (alienBounds.intersects(missileBounds)) 
       { 
        delete (*iter); 
        iter = myAliens.erase(iter); 
        cout << "HIT" << endl; 

       } 
       else 
       { 
        iter++; 
       } 
      } 
     } 
     else 
     { 
      iter++; 
     } 
    } 
    return hit; 
} 
+2

*如果玩家擊中外星人,則切換爲true並返回。* - 否,它不會切換爲true。這就是評論所說的,但這不是代碼中發生的事情:)。在做任何修復之前 - 將變量聲明移動到初始化的位置;在函數的開頭聲明它們是糟糕的,過時的做法。同樣,你不應該手動管理你的對象的生命週期;存儲值會阻止你不得不刪除它們。清理噪音將幫助您專注於您遇到的實際問題。 –

+0

如果你想移除一個外星人和所有與它碰撞的導彈,你需要在移除外星人之前移除導彈。 – molbdnilo

回答

0

你在你的代碼的幾個問題。我試圖清理它們。另外,我希望你可以使用C++ 11.但是,還有更多的關鍵問題。你的代碼太C++ 98'ish。 我勸了一些改進:

  • 使用std::vector而不是std::list(這是真的難找的情況下,當列表會更快)
  • 使用智能指針代替人工內存管理(代碼將是非常簡單的並且更容易理解)