1

弾丸のベクトルから「死んだ」弾丸を取り除こうとしています。すべてのフレームで、次のような Bullet::update() 関数を呼び出しています。

    void Bullet::update()
{
    for(int i = 0; i != mAmmo.size(); i++)
    {
        if(mAmmo[i].sprite.getPosition().x > 700)
            mAmmo[i].mAlive = false;
        if(mAmmo[i].mAlive == false)
        {
// I get a Debug Assertion Failed at runtime from this piece of code
            mAmmo.erase(mAmmo.begin()+i);
        }

        if(mAmmo[i].mAlive == true)
        {
            mAmmo[i].sprite.move(mMovement);
        }

    }

}

私はこれを完全に間違っていますか?チュートリアルに従うだけでなく、ベクトルを実際に使用したのはこれが初めてです。さらにコードを投稿する必要がある場合は、教えてください。私は過去数時間これに取り組んできたので、これを機能させるために少し必死です。

前もって感謝します!

4

1 に答える 1

1

ith 要素がリストの最後の要素になるとすぐに、未定義の動作に簡単に陥ります。イテレータを使用し、 の戻り値に特に注意してerase()ください。自動的にイテレータが進められるため、ループで行う必要はありません。

void Bullet::update()
{
    for (auto it = mAmmo.begin(); it != mAmmo.end();)
    {
        if(it->sprite.getPosition().x > 700)
            it->mAlive = false;

        if (!it->mAlive)
        {
            // erase and get next iterator
            it = mAmmo.erase(it);
        }
        else
        {   // move and increment
            it->sprite.move(mMovement);
            ++it;
        }
    }
}
于 2013-09-20T00:35:20.513 に答える