Java 碰撞时从ArrayList中删除对象

Java 碰撞时从ArrayList中删除对象,java,arrays,Java,Arrays,我正在用java做一个基本的游戏。在游戏中,你是一个方块,通过使用键(向上、向下等),你应该射杀敌人。这也是一个街区。我在两个物体之间有一个有效的碰撞,它起作用了。然而,当子弹击中敌人时,它应该消失。当所有的敌人都被“杀死”时,你就赢了。到目前为止,这基本上就是我得到的 ArrayList<Enemy> enemy; ArrayList<Bullet> bullets; [...] public void collision (){ for(Bullet b

我正在用java做一个基本的游戏。在游戏中,你是一个方块,通过使用键(向上、向下等),你应该射杀敌人。这也是一个街区。我在两个物体之间有一个有效的碰撞,它起作用了。然而,当子弹击中敌人时,它应该消失。当所有的敌人都被“杀死”时,你就赢了。到目前为止,这基本上就是我得到的

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);

            }

        }

    }
因此,当你用子弹击中敌人时,我首先在
处得到一个java.util.ConcurrentModificationException(敌人e:敌军){


但是,如果我按特定顺序攻击敌人,我可以删除除1个敌人以外的所有敌人。然后发生错误。碰撞方法放置在“gameloop”中。

除非通过列表迭代器本身进行删除,否则无法从正在迭代的列表中删除

将代码更改为显式迭代(而不是使用
for
循环的“for each”形式),为敌人创建一个迭代器,然后调用
enemyIterator.remove()
以避免此问题:

ListIterator<Enemy> enemyIterator = enemy.listIterator();
while (enemyIterator.hasNext()) {
    Rectangle r2 = enemyIterator.next().getBounds();
    if(r1.intersects(r2)) {
        enemyIterator.remove();
    }
}
ListIterator-enemyIterator=敌军。ListIterator();
while(enemyIterator.hasNext()){
矩形r2=enemyIterator.next().getBounds();
if(r1.相交(r2)){
enemyIterator.remove();
}
}

Quick Hack:
List敌军=new CopyOnWriteArrayList();
被否决,因为您没有(完全)阅读
ConcurrentModificationException
的文档。在您的代码中,什么是
e
?@JoshM
e
代表“复制粘贴错误”:-)谢谢你指出这一点。哈哈哈:)还有,是不是
enemyIterator.remove()
P@JoshM是的!我今天对复制/粘贴太马虎了……在你匆忙粘贴的过程中,你对复制太马虎了!
ListIterator<Enemy> enemyIterator = enemy.listIterator();
while (enemyIterator.hasNext()) {
    Rectangle r2 = enemyIterator.next().getBounds();
    if(r1.intersects(r2)) {
        enemyIterator.remove();
    }
}