1

私はSFML 2で簡単なゲームを作っていますが、これまでのところスムーズに進みました。敵用とレーザー用の 2 つの sf::Sprite リストを作成しました。敵は画面外にランダムにスポーンし、入力が与えられるたびにレーザーが生成されます。両方のリストに対して衝突ループを作成し、コードを実行しました。コンパイル時および実行時のエラーはありません。レーザーと敵の衝突は、最初の 3 ~ 4 人の敵に対しては正常に機能しますが、その後、衝突は発生しません。この問題の原因は何ですか? これについて私を助けてください。ありがとう。これが私のコードです。

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;
}
4

1 に答える 1

2

多くのイテレータ操作を行っているようで、問題が発生している可能性があります。

C++11 を使用できる場合は、for each ループ ( 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);
          }
       }
    }

編集:それ以外の場合、イテレータの問題を理解するために私が見つけた1つの方法は、手動でステップスルーすることです。各位置のセルを含む 2 つの四角形を描画し、反復子を追跡して、ロジックを段階的に実行します。ロジックを反復するたびに、予想される結果を書き留めます。次に、手で調べて、結果が期待どおりかどうかを確認します。

于 2013-08-28T01:34:10.897 に答える