2013-08-26 31 views
1

我在SFML 2中做了一個簡單的遊戲,到目前爲止順利。我創建了兩個sf :: Sprite列表,一個用於敵人,一個用於激光。隨機產生的敵人離開屏幕,每當輸入時就會創建激光。我爲這兩個列表創建了一個碰撞循環並執行了我的代碼。沒有編譯時和運行時錯誤。激光與敵人的碰撞對前3到4名敵人都很好,但在此之後,碰撞不會發生。什麼可能導致這個問題?請幫助我。謝謝。這是我的代碼。兩個精靈列表的碰撞 - SFML 2.0

std::list<sf::Sprite>::iterator enemyit = enemy.begin(), next; 
std::list<sf::Sprite>::iterator greenlaserit = greenlaser.begin(), reload; 
while(enemyit != enemy.end()) 
{ 
    next = enemyit; 
    next++; 
    while(greenlaserit != greenlaser.end()) 
    { 
     reload = greenlaserit; 
     reload++; 
     if(enemyit->getGlobalBounds().intersects(greenlaserit->getGlobalBounds())) 
     { 
       enemy.erase(enemyit); 
       greenlaser.erase(greenlaserit); 
       ++erased; 
     } 
     greenlaserit = reload; 
    } 
    enemyit = next; 
} 

回答

2

這似乎是,你正在做很多的迭代器操作,這可能是問題發生的地方。

如果你可以使用C++ 11,我會建議看看每個循環(http://www.cprogramming.com/c++11/c++11-ranged-for-loop.html),以保持閱讀和理解的簡單性(因此更易於調試)。

你可以做這樣的事情:

std::list<sf::Sprite> enemies; 
    std::list<sf::Sprite> lasers; 

    for (sf::Sprite enemy: enemies) { 
     for (sf::Sprite laser : lasers) { 
      if (enemy.getGlobalBounds().intersects(laser.getGlobalBounds())) { 
      enemies.remove(enemy); 
      lasers.remove(laser); 
      } 
     } 
    } 

編輯:否則,一個方法我已經找到搞清楚一個迭代問題是由手通過它加強。我爲每個位置繪製兩個帶有單元格的矩形,並跟蹤迭代器並逐步執行邏輯。在每次邏輯迭代之前,寫下您的預期結果。然後手工完成,看看你的結果是否符合你的期望。

+0

我沒有使用C++ 11。但是,我會嘗試你的第二種方法。謝謝。 – WDRKKS

+0

是否有什麼特別的原因讓你通過創建第二個變量(next,reload)來遍歷列表,然後立即迭代它?在我看來,這總是會跳過列表中的第一個元素。 – charzoc

+0

這是爲了確保迭代器不會到達list :: end()。當我不使用第二個變量時,它會崩潰。 – WDRKKS