2011-06-20 20 views
1

AndEngineを使用してAndroidゲームを作成しようとしていて、いくつかの成功を収めています。私はターゲットタップのクローンを作成しようとしています。これは基本的に画面上のいくつかの異なるターゲットをタップしてそれらを取り除くことです。AndEngine - スプライトが画面に残っている...時々

これは1つのターゲットで完全に動作し、それを削除するためには簡単にタップできます。問題は、画面上に複数のターゲットがある場合、常にが消えますが、ポイントを追加して1つのヒット時に発生するはずのものをすべて追加することです。

runOnUpdateThread(...)ブロック内でスプライトを実行する正しい方法を(私が知る限り)削除します。

Game.runOnUpdateThread(new Runnable() { 
    @Override 
    public void run() { 

     // Loop through all targets and check validity 
     for (Iterator<Target> i = Game.this.mTargets.iterator(); i.hasNext();) { 

      Target t = i.next(); // Target extends Sprite 

      // If the target isn't valid, remove it from the scene and ArrayList 
      if (!t.isValid()) { 
       scene.unregisterTouchArea(t); 
       scene.detachChild(t); 
       Game.this.mTarget.remove(t); 
      } 
     } 
} 

申し訳ありませんが、これは少し簡単ですが、どこに問題があるのか​​分かりませんから、私はどのコードを提供するのか分かりません。私は現在、実際のデバイスでそれをテストすることはできませんが、これが単にエミュレータと何かになるかどうか疑問に思っていたのは、コードが正確であると判断し、多くのことを試みたからです。私を助けてくれる助けが必要な場合は、私に知らせてください!

ありがとうございます。

答えて

3

削除すると、ArrayListをスキップしているようです。あなたが目標(5)にいるとし、それが無効になると言う。次に、リストから5番目の要素を削除し、そこからすべてを下に移動するので、古い6番目の要素が5番目になります。その後、ループバックすると、新しいの5番目の要素の直後にnext()が表示されます。

は、通常、私はこのケースでやっていることは、次のいずれかです。

(a)の逆方向リストを実行するか、

私は1つを削除し、実行する前に、それをチェックすると(b)の真のブール値を設定します次の反復でnext()関数または、より多くの可能性が高い。..

(c)は、イテレータを使用して、代わりにget()関数を使用する、すなわち

for (int i=0;i<Game.this.mTarget.size();i++) { 

     Target t = Game.this.mTarget.get(i); // Target extends Sprite 

     // If the target isn't valid, remove it from the scene and ArrayList 
     if (!t.isValid()) { 
      scene.unregisterTouchArea(t); 
      scene.detachChild(t); 
      Game.this.mTarget.remove(t); 
      // Decrease i to keep in sync with the new list 
      i--; 
     } 
    } 
+0

うん、私は一種の投稿後数時間を実現していません。私は今すぐ削除する代わりにリセットしただけの数のターゲットを持つことにしました。ありがとう! – Peter

+0

@Bigtoes逆向きに繰り返すのはなぜですか? (あなたがインデックスで遊ぶ必要はありません;)(List.size()を避けることができます)すべてのループを呼び出します)。 – sjkm

関連する問題