2016-08-02 14 views
0

私はC++とsfmlで宇宙シューターゲームを構築しています。 今私は弾丸クラスを持っています。弾丸オブジェクトを格納して描画し、何かを撃ったり範囲外になったりすると、それらを取り消したり削除したりする方法が必要です。私はそれらをリストに追加しています。各弾丸オブジェクトにはaliveというブール属性があり、移動距離や他のオブジェクトとの衝突に基づいて常に更新されます。私は、それが衝突するか、または範囲外になるたびに、生き残りをfalseに設定します。次に、リストを反復して、alive属性がfalseのすべてのオブジェクトを削除します。しかし、これは恐ろしい方法のように聞こえますし、弾丸オブジェクトはリストから削除しても解放されますか?ここでキープレスで新しいオブジェクトを作成してリストに追加する

私のコードは、これまでのところです:

if (Keyboard::isKeyPressed(sf::Keyboard::T)) { 
     Bullet newBullet(mySub.getSprite().getPosition().x + 64, mySub.getSprite().getPosition().y + 20); 
     bulletList.push_back(newBullet); 
} 
list<Bullet>::iterator it = bulletList.begin(); 
while (it != bulletList.end()) { 
     if (it->getNoDraw() == true) { 
      bulletList.erase(it++); 
     } 
     else { 
      it->update(); 
      if (it->getBulletSprite().getPosition().x > mySub.getSprite().getPosition().x + 1200) { 
        it->setNoDraw(); 
       } 
      } 
     } 

cout << "list size " << bulletList.size() << endl; 
for (list<Bullet>::iterator it = bulletList.begin(); it != bulletList.end(); ++it) { 
      window.draw(it->getBulletSprite()); 
} 

私は新しい弾丸オブジェクトを作成し、bulletListに私はTを押すたびに、それを追加するが、それは実際ので、リストに新しい箇条書きを追加していませんよbulletList.size()は常に0を出力します。どのようにすればこれを効果的に行うことができますか?

+0

なぜforループを使用して描画しますか?あなたは、if(it-> getNoDraw()== true)のelse部分にその箇条書きを描画できませんか?リストを一度しか反復しないので、より効果的です。 – Lucian

+0

あなたは正しいです。後でコードを更新して、オブジェクトを更新し描画するために1回の繰り返しを使用します。それは、私がすべてのオブジェクトを更新し、それらのすべてを描画することに慣れていることです。これが当てはまる場合は、for-loop huhの前にウィンドウをクリアする必要があります。 – Chrine

答えて

1

コードにいくつかの障害があります。 listerase()を再読し、次のイテレータを返します。 また、あなたが弾を破壊しないときにあなたの欠けているリストに進んでください。

if (Keyboard::isKeyPressed(sf::Keyboard::T)) { 
     Bullet newBullet(mySub.getSprite().getPosition().x + 64, 
         mySub.getSprite().getPosition().y + 20); 
     bulletList.push_back(newBullet); 
} 
list<Bullet>::iterator it = bulletList.begin(); 
while (it != bulletList.end()) { 
    if (it->getNoDraw() == true) { 
     it = bulletList.erase(it); // erase already advance it to the next 
    } else { 
     it->update(); 
     if (it->getBulletSprite().getPosition().x > 
       mySub.getSprite().getPosition().x + 1200) { 
      it->setNoDraw(); 
     } 
     it++; // move on to the next position 
    } 
} 

cout << "list size " << bulletList.size() << endl; 
for (list<Bullet>::iterator it = bulletList.begin(); 
    it != bulletList.end(); ++it) { 
    window.draw(it->getBulletSprite()); 
} 
+0

'bulletList.erase(it);'は 'それを無効にします。 'it'を返されたイテレータで更新することを忘れないでください。 – Hiura

+0

bulletList.erase(it)をbulletList.erase(it)に変更しました。 – Chrine

+0

コードが修正され、 'it ='部分が欠落していました。 – Surt

関連する問題