1

スペースを押すと弾丸が作成され、弾丸が画面から消えると弾丸が破壊される垂直スクロールシューティングゲームを作成しようとしています。vector<BULLET> bullets;画面の外にある弾丸を破壊しようとすると、次のような大量のエラーが発生します 。c:\mingw\bin\..\lib\gcc\mingw32\4.7.0\include\c++\bits\stl_algobase.h|384| required from '_OI std::__copy_move_a(_II, _II, _OI) [with bool _IsMove = true; _II = BULLET*; _OI = BULLET*]'|

私のコードは次のようになります。

for( auto it = bullets.begin(); it != bullets.end(); ){
    if( it->is_dead()){
        it = bullets.erase(it);
    }else{
        it++;
    }
}

私を苛立たせている部分は、ポインタを保持するベクトルで削除する必要があるゲームオブジェクトを削除する同様のループがあることです:

for( auto it = activeInstances.begin(); 
it != activeInstances.end(); ){
    if( (*it)->is_dead()){
        it = activeInstances.erase(it);
    }else{
        it++;
    }
}

これは問題なく動作します。

編集:違いがあるかどうかはわかりませんが、参考までに、ベクトルに箇条書きを追加する同じ関数で後で発生するセクションを追加しています:

if( key[SPACE] && reload == 0){
    reload = reloadTime;
    BULLET newBullet;
    newBullet.init( x, y);
    bullets.push_back( newBullet);
}
4

3 に答える 3

1

あなたのコードフラグメントは異なります:

if( it->is_dead()){

対。

if( (*it)->is_dead()){
于 2013-07-15T09:20:19.300 に答える
1

アイテムを削除するには、 erase-remove イディオムを使用することをお勧めしstd::vector ます (詳細な議論については、この StackOverflow Q&Aを検討してください。他のコンテナーにも適用されます)。

// Erase elements matching "erasing_condition" from vector "v"
v.erase( std::remove_if(v.begin(), v.end(), erasing_condition), v.end() );

特定のケースでは、次のようなコードを使用したい場合があります。

//
// Erase elements matching "BULLET.is_dead()" from vector "bullets".
// ("bullets" is a "vector<BULLET>")
//
bullets.erase
(     
    std::remove_if
    ( 
        bullets.begin(), 
        bullets.end(), 

        // Erasing condition
        [](const BULLET& bullet)
        { 
            return bullet.is_dead(); 
        }   
    ), 
    bullets.end() 
);

ところで:スタイルガイドとして、C++クラス名のBullet代わりに好むでしょう(通常、C++のプリプロセッサマクロ用に予約されています...)。BULLETALL_UPPERCASE_STYLE

于 2013-07-15T11:27:06.723 に答える