2017-10-20 14 views
-4

"プレイゾーン"の外に出ているか、ユーザーに見えるものを少なくとも削除しようとしています。私はエラーは出ませんが、このコードサンプルを "killEdgeEntities"関数で試してみると、ゲームが始まりました。 "if文"が直接実行されたかのように、すべてがすでに死んでいます。そして、いいえ、私は議論の外に何も産んでいません。たとえば、ユーザーのShipは画面の中央に生成されます。C++エラーからデバッグすることはできませんが、コードにエラーはありません

皆さんにもっと情報が必要な場合は、それについてコメントしてください。本当に

void Invaders::killEdgeEntities() { 
EntityVector entities; 
for (EntityVector::iterator j = mEntities.begin(); j != mEntities.end(); j++) { 
    Entity *entity = *j; 
    // * Dödsgränser * 
    // Vänster: 
    if (entity->getPosition().getX() < -20) { 
     delete entity; 
    } 
    // Höger: 
    if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) { 
     delete entity; 
    } 
    // Upp: 
    if (entity->getPosition().getY() < -80) { 
     delete entity; 
    } 
    // Ner: 
    if (entity->getPosition().getY() > VGCDisplay::getHeight() + 20) { 
     delete entity; 
    } 

} 
mEntities = entities; 
} 
+1

「エンティティ」は空のベクトルです。 'mEntities = entities;' 'mEntities'も空のベクトルにして、前のすべての内容を漏らします。 'エンティティ'に何かを追加することを意味しましたか? –

+1

_「30分でポストを見ているよ」_このような短期間でどのように悪いことが起こるのか驚かれるでしょう。 – user0042

+1

あなたの投稿にかなりの冗談が含まれています。あなたは[mcve]を表示し、誰かがあなたのゲームを知らない人を理解できるという点でコードの何が間違っているかを記述することをお勧めします。 – user463035818

答えて

1

ない答え - あなたは、私たちは何が起こっているうち動作させるために十分なコードを掲示していませんでした...しかし、あなたは問題を参照するのに十分なを掲載しているからです。

if (entity->getPosition().getX() < -20) { 
    delete entity; 
} 
// Höger: 
if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) { 

x < -20とエンティティを削除するとどうなりますか?あなたは今浮動ポインタ(すなわち、有効なメモリを指していない)である次の行にアクセスしようとします...そして、起こるのを待っているクラッシュ。

+0

あなたは何を言っているのか分かりますが、if文ごとにforループを実行する必要がありますか?それ以来、私は他の人たちと干渉していません。今すぐ試してみます – fluxe

+0

@fluxe - この特定の問題は 'else if'で解決できます。しかし、あなたはまだ 'mEntities'に同じ無効なポインタを持つかもしれません。 –

+0

あなたはまた、リストからポインタを削除しません。つまり、あなたが見えなくなるクラッシュのためにあなた自身を裏打ちしています。最善の解決策は、スマートポインタを使用して、リスト(削除は自動的に行われます) – UKMonkey

0

これは私の問題を解決しました。エンティティのEntityVector "エンティティ"に対するpush_backを最後にelseバッチを作成することで解決しました。そして最後に、forループの後に、それらがインラインであることを確認する(parallell私は推測する)。

void Invaders::killEdgeEntities() { 

    EntityVector entities; 
    for (EntityVector::iterator i = mEntities.begin(); i != mEntities.end(); i++) { 
     Entity *entity = *i; 
     // * Dödsgränser * 
     // Vänster: 
     if (entity->getPosition().getX() < -20) { 
      delete entity; 
     } 
     // Höger: 
     else if (entity->getPosition().getX() > VGCDisplay::getWidth() + 20) { 
      delete entity; 
     } 
     // Upp: 
     else if (entity->getPosition().getY() < -80) { 
      delete entity; 
     } 
     // Ner: 
     else if (entity->getPosition().getY() > VGCDisplay::getHeight() + 20) { 
      delete entity; 
     } 
     else { 
      entities.push_back(entity); 
     } 
    } 
    mEntities = entities; 
} 
関連する問題