2014-01-06 91 views
-1

我正在用java製作基本遊戲。在遊戲中,你是一個街區,通過使用按鍵(上,下等),你應該射擊敵人。這也是一個塊。我有兩個對象之間的工作碰撞,它的工作原理。但是,當子彈擊中敵人時,它應該消失。當所有的敵人都「被殺死」時,你就贏了。這基本上是我迄今爲止得到的。碰撞時從ArrayList中移除對象

ArrayList<Enemy> enemy; 
ArrayList<Bullet> bullets; 

[...] 

public void collision(){ 

    for(Bullet b : bullets){ 

     Rectangle r1 = b.getBounds(); 

     for(Enemy e : enemy){ 

      Rectangle r2 = e.getBounds(); 

      if(r1.intersects(r2)){ 

       enemy.remove(e); 

      } 

     } 

    } 

的敵人是由一個.txt

else if(mark == 'E'){ 
    enemies.add(new Enemy(x * 20 + 10, y * 20 + 35, 40)); 
} 

所以催生當你打敵人子彈我在for(Enemy e : enemy){

得到java.util.ConcurrentModificationException首先但是如果我打敵人按照特定的順序我可以刪除除1個敵人以外的所有敵人。然後發生錯誤。碰撞方法被放置在「gameloop」中。

+0

快速哈克:'列表 enemy = new CopyOnWriteArrayList ();' –

+1

downvoted因爲您沒有(完全)讀取'ConcurrentModificationException'的文檔。 –

回答

7

除非通過列表迭代器本身完成刪除,否則無法從正在迭代的列表中刪除。

更改您的代碼來顯式迭代(而不是使用「爲每個」形式for環路),創造了敵人一個迭代,並調用enemyIterator.remove()避免這個問題:

ListIterator<Enemy> enemyIterator = enemy.listIterator(); 
while (enemyIterator.hasNext()) { 
    Rectangle r2 = enemyIterator.next().getBounds(); 
    if(r1.intersects(r2)) { 
     enemyIterator.remove(); 
    } 
} 
+0

在你的代碼中,「e」是什麼? –

+0

@JoshM'e'代表「複製粘貼** e ** rror」:-)感謝您指出這一點。 – dasblinkenlight

+0

LOL aha:)另外,是不是'enemyIterator.remove()'? :P –