2014-01-06 67 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 –