2012-02-15 5 views
0

私はArrayListがあり、私のアンドロイドゲームでプレーン(敵)を保持しています。これらの面は、画面の一方の側から他方の面に移動し、ユーザーはそれらをかわす必要があります。プレーンのx値が-50より小さくなると、ArrayListから削除されます。これが起こると、画面上のすべてのプレーンが現在「少しジャンプ」します。それらは数ミリ秒間消えて再描画されますが、元の場所の2倍後ろに描画されます。ここでArrayListからオブジェクトを削除すると遅れが発生する

は飛行機がArrayListの

public void onDraw(){ 
     bg1.onDraw(c); 
    bg2.onDraw(c); 
    chopper.onDraw(c); 

    score.onDraw(c); 

    // PAINTS THE PLANE OR DELETES IF OFF SCREEN 
    for (int i = 0; i < planes.size(); i++) { 
     Plane p = planes.get(i); 
        if(p.getX()<-50){ 
          planes.remove(p); 
        }else{ 
          p.onDraw(c); 

          if (p.getX() < 170) { 
            detectPlaneCollision(p, c); 
          } 
        } 

      } 
} 

がこれを固定する方法はありますされpaintメソッド、ありますか?私は別のデータ構造を使うべきですか?

おかげ

トム

+0

なぜあなたは10秒間ボッターしてコードを正しくフォーマットしないでください –

+0

私は試してみましたが、正しく入力されたときにフォーマットされましたが、なぜそれが行われたのか分かりません。 – TomRichardson

答えて

1

あなたの問題はデータ構造の選択とは関係ありませんが、をループしている間にListを変更しているためです。

[P1、P2、P3]のリストに3つのプレーンがあるとします。あなたのループiの最初の繰り返しで

  • あなたは、プロセス、0であるP1がgetX() < -50を持っP1
  • ので、あなたが今、リストを作り、それを削除し、ループの次の反復で[P2、P3]
  • i1になりますので、P3を処理します。
  • これは、P2が決して処理されないので、決して描かれず、簡単に消えることを意味します。

Iteratorを使用すると、Listをループしている間に安全にアイテムを取り外すことができます。

Iterator<Plane> i = planes.iterator(); 

while (i.hasNext()) { 
    Plane p = i.next(); 

    if (p.getX() < -50) { 
    i.remove(); 
    } else { 
    p.onDraw(c); 

    if (p.getX() < 170) { 
     detectPlaneCollision(p, c); 
    } 
    } 
} 

、あなたがSetはなくListに格納検討することもでき、あなたのPlane obejctsを処理する順番を気にしないので、けれども。 Setは、アイテムの追加や削除時にアイテムの順序を維持することについて心配する必要はありません。

+0

ありがとう、私はこれを試して、それは働いた。以前はイテレーターのことを聞いたことはありませんでしたので、私にこれを見せていただきありがとうございます! – TomRichardson

+0

最近では、リストを変更しているときにイテレータを使うだけです。そうでなければ、 'for(Plane p:飛行機){...}'と言うことができます。 –

0

あなたが削除して、リストから追加することの多くを行う場合は、LinkedListを使用することを検討してください。データセットの変更がほとんどない場合は、ArrayListが適しています。

あなたもLinkedListから要素を取得することはArrayListからより若干遅くなりますが、そうLinkedListを使用する際に念頭に置いてそれを維持しているという事実を考慮する必要がありますが。

0

私はそのコードにバグがあると思います。

i==0planes[0]が削除されたらどうなりますか?

planes[n]は、planes[n-1]に移動します。例えば。 planes[1]planes[0]に移動します。

iが増加するので、i==1となります。

したがって、元のplanes[1](現在はplanes[0])はスキップされます。

+0

ああ、飛行機[0]は常に削除されているので、もちろん、これはスキップを説明することができます! – TomRichardson

関連する問題