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(); 
}
}

すべてが少し厄介に見える場合は、簡単な説明を次に示します。

イテレータが各小惑星を通過するときに、プレーヤーが各小惑星と衝突しているかどうかを確認します。現在、これは何もしません

次に、弾丸のベクトルを繰り返し処理し、各弾丸を現在の小惑星と照合します。衝突が発生した場合は、弾丸と小惑星の両方を破壊して消去し、破壊された小惑星がベクトル内で保持していた位置を印刷します。

それが終わったら、次の小惑星のために弾丸の反復をリセットします。

現在の私の主要な問題は、(*イテレータ)<-小惑星による更新の呼び出しです。

この問題は、小惑星ベクトルの最後のオブジェクトを消去しているときにのみ発生します。私は、eraseが次のオブジェクトにイテレータを返すことを知っています-次のオブジェクトが存在しない場合、エラーがスローされます(イテレータがnullptrを指しているので、正しいですか?)。nullptrのチェックを行っていますが無駄です。

誰かが彼らが提供できるアドバイスや助けがありますか?数時間頭をかいてくれてありがとう!

4

1 に答える 1

1

問題は、最後の小惑星を破壊すると、iteratorがに設定されることですbigAsteroids.end()(の結果に割り当てられることによりerase())。次に、内部whileループが終了した後、を逆参照しiteratorます。過去のイテレータは逆参照できません。

チェックの順序を切り替える必要があります。

if (iterator != bigAsteroids.end() && *iterator != nullptr)
于 2013-02-22T11:42:30.663 に答える