1

AndEngineを使用してAndroidゲームを作成しようとしていますが、いくつかの成功を収めています。私は、基本的に画面上のいくつかの異なるターゲットをタップしてそれらを削除することを含むターゲットタップクローンを作成しようとしています(モグラたたきのようなものです)。

これは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);
            }
        }
}

申し訳ありませんが、これは少し簡単ですが、問題がどこにあるのかわからないため、どのコードを提供すればよいかわかりません。現在、実際のデバイスでテストすることはできませんが、コードが正しいことがわかり、多くのことを試したので、これがエミュレーターと関係があるのではないかと考えていました。私を助ける助けが必要な場合は、私に知らせてください!

ありがとう

4

1 に答える 1

3

ArrayListを削除すると、スキップしているように見えます。あなたがtargets(5)にいて、それが無効になっているとしましょう。次に、リストから5番目の要素を削除し、そこからすべてを1つ下にシフトするため、古い6番目が5番目になります。次に、ループバックすると、新しい5番目next()の要素のすぐ前をヒットします。

通常、この場合に私が行うことは次のいずれかです。

(a)リストを逆方向に実行する、または

(b)ブール値を削除する場合はtrueに設定し、次の反復で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--;
        }
    }
于 2011-06-21T07:19:28.717 に答える