2011-07-21 12 views
0

私は2つのArrayListを持っています.1つは敵のスプライト用で、もう1つは弾丸用です。私がアプリを実行すると、エミュレータで時々クラッシュし、いくつかのレベルで衝突時にデバイス上でクラッシュします。ログは、単純なListIteratorエラーが発生していることを伝え続けます。私はListIteratorをどのように実装するのか知りたかったのです。私はListIteratorを使用していませんでしたが、情報や例を探すために検索しましたが、実際にそれを行う方法について少し混乱しています。 add()関数は、私のビュークラスのonTouchメソッドで呼び出され、衝突は独自の衝突メソッドでスレッドクラス内で行われます。AndroidゲームのListiterator

ログイン:

07-20 19:57:46.604: ERROR/AndroidRuntime(234): Uncaught handler: thread Thread-9 exiting due to uncaught exception 
07-20 19:57:46.613: ERROR/AndroidRuntime(234): java.util.ConcurrentModificationException 
07-20 19:57:46.613: ERROR/AndroidRuntime(234):  at java.util.AbstractList$SimpleListIterator.next(AbstractList.java:64) 
07-20 19:57:46.613: ERROR/AndroidRuntime(234):  at com.android.hitmanassault.HitmanView$HitmanThread.startGame(HitmanView.java:333) 
07-20 19:57:46.613: ERROR/AndroidRuntime(234):  at com.android.hitmanassault.HitmanView$HitmanThread.gameStart(HitmanView.java:290) 
07-20 19:57:46.613: ERROR/AndroidRuntime(234):  at com.android.hitmanassault.HitmanView$HitmanThread.updateGame(HitmanView.java:393) 
07-20 19:57:46.613: ERROR/AndroidRuntime(234):  at com.android.hitmanassault.HitmanView$HitmanThread.run(HitmanView.java:237) 

をチェック衝突:

private void startGame(){ 
      synchronized(mSurfaceHolder){ 
       for(Beam bullet: beam){ 
        for(Sprite sprite: sprites){ 
         if(checkCollision(sprite, bullet)){ 
          sprites.remove(sprite); 
          beam.remove(bullet); 
          mScore = mScore + 1; 
          break; 
         }    
        } 
       } 
      }  
     } 

衝突方法:

public boolean checkCollision(Sprite sprite, Beam bullet){ 

      boolean retValue = false; 
      int SpriteX = sprite.getX(); 
      int SpriteY = sprite.getY(); 
      int SpriteXS = sprite.getX() + sprite.getWidth(); 
      int SpriteYS = sprite.getY() + sprite.getHeight(); 
      int BeamX = bullet.getX(); 
      int BeamY = bullet.getY(); 
      int BeamXS = bullet.getX() + bullet.getBitmap().getWidth(); 
      int BeamYS = bullet.getY() + bullet.getBitmap().getHeight(); 


      if ((BeamX >= SpriteX && BeamX <= SpriteXS) || (BeamXS >= SpriteX && BeamXS <= SpriteXS)) { 
       if ((BeamY >= SpriteY && BeamY <= SpriteYS) || (BeamYS >= SpriteY && BeamYS <= SpriteYS)) { 
        retValue = true; 
       } 
      } 
      return retValue; 
     } 
+0

ログを投稿できますか?それは 'ConcurrentModificationException'ですか? – user802421

+0

リストを反復処理するコードを貼り付けてください。 –

答えて

2

別のスレッドがリストを反復しながら、あなたはリストに要素を追加した場合、あなたは意志ConcurrentModificationExceptionを取得します。

あなたはConcurrentLinkedQueueを試すことができますが、ゲームの一貫性モデルに関する要件に応じて、アーキテクチャを再考する必要があります。

これは問題です。

for(Sprite sprite: sprites) { <------- Iterate 
    if(checkCollision(sprite, bullet)) { 
     sprites.remove(sprite); <-------- Modify 
... 

クイックフィックスでは、削除するすべての要素を収集してから、ループの後に削除できますか?

ArrayList<Beam> toBeRemoveBeams = new ArrayList<Beam>(); 
ArrayList<Sprite> toBeRemoveSprites = new ArrayList<Sprite>(); 
for(Beam bullet: beam){ 
    for(Sprite sprite: sprites){ 
     if(checkCollision(sprite, bullet)){ 
      toBeRemoveBeams.add(beam); 
      toBeRemoveSprites.add(sprite); 
      mScore = mScore + 1; 
      break; 
     }    
    } 
} 
beam.removeAll(toBeRemoveBeams); 
sprites.removeAll(toBeRemoveSprites); 
+0

それで、彼らが撮影されるとき、彼らは削除されるまで、または一度衝突が起こるまで表示されます。 – Manji

+0

スレッド9の代わりにスレッド13を使用した場合を除いて、同じエラーが再び発生しました – Manji