0

私のコードは、思ったように機能しません。このリストlistColumn0には、画面上の 8 つのスプライト オブジェクトの X 位置と Y 位置が含まれています。それらの 1 つに触れると、その X と Y の位置に一致するウィッチ スプライト オブジェクトをチェックし、リストから削除します。しかし、奇妙なことに、インデックス 7 の最後のスプライト オブジェクトに最初に触れてから、インデックス 6 のスプライト オブジェクトを続けた場合にのみ、これが機能するということです。

たとえば、インデックス 3 のスプライト オブジェクトまたは最後のもの以外のスプライト オブジェクトをクリックすると、アプリが終了します。なぜこれ?私が間違ったことを誰かが見ることができますか、それともより良い方法でこれを行うことができますか? タッチしたスプライト オブジェクトを検出/照合するより良い方法はありますか?

        String size = Integer.toString(listColumn0.size());
    // Check all lists
    for(ColorObject colorObject: listColumn0) {
        if(x > (colorObject.xPosition - colorObject.radius) && x < (colorObject.xPosition + colorObject.radius) && y > (colorObject.yPosition - colorObject.radius) && y < (colorObject.yPosition + colorObject.radius)) {

            String colorCode = Integer.toString(colorObject.color);
            String index = Integer.toString(listColumn0.indexOf(colorObject));
            Log.i("Test","Match!! " + size + " Color: " + colorCode + "ID: " + index);

            listColumn0.remove(listColumn0.indexOf(colorObject));
        }
    }

編集:

LogCat からのエラー メッセージ:

05-22 07:08:55.482: W/dalvikvm(1444): threadid=12: thread exiting with uncaught exception (group=0x40a13300)
05-22 07:08:55.482: E/AndroidRuntime(1444): FATAL EXCEPTION: Thread-124
05-22 07:08:55.482: E/AndroidRuntime(1444): java.util.ConcurrentModificationException
05-22 07:08:55.482: E/AndroidRuntime(1444):     at java.util.ArrayList$ArrayListIterator.next(ArrayList.java:569)
05-22 07:08:55.482: E/AndroidRuntime(1444):     at com.test.game.ColorObjectManager.checkPosition(ColorObjectManager.java:164)
05-22 07:08:55.482: E/AndroidRuntime(1444):     at com.test.game.GameLoop.run(GameLoop.java:190)
05-22 07:08:55.482: E/AndroidRuntime(1444):     at java.lang.Thread.run(Thread.java:856)
05-22 07:13:55.753: I/Process(1444): Sending signal. PID: 1444 SIG: 9
4

2 に答える 2

1

listColumn0foreach ループで反復中に変更することはできません。ConcurrentModificationExceptionこれを行うと、LogCat で確認できる結果が得られます。

昔ながらの を使用すると、反復中にコレクションを変更できますIterator

Iterator<ColorObject> it = listColumn0.iterator();
while(it.hasNext()) {
   ColorObject colorObject = it.next();
   ...
   it.remove(); // this removes the current object
}

その範囲を縮小するitには、ここで for ループを使用するのがベスト プラクティスです。

for (Iterator<ColorObject> it = listColumn0.iterator(); it.hasNext();) {
   ColorObject colorObject = it.next();
   ...
   it.remove(); // this removes the current object
}
于 2013-05-22T07:25:13.777 に答える