碰撞时从ArrayList中删除对象

时间:2014-01-06 18:25:39

标签: java arrays

我正在用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);

            }

        }

    }

敌人是由.txt

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

所以当你用子弹击中敌人时,我首先在for(Enemy e : enemy){

获得java.util.ConcurrentModificationException

然而,如果我按特定顺序击中敌人,我可以删除除1个敌人以外的所有敌人。然后发生错误。碰撞方法放在“游戏循环”中。

1 个答案:

答案 0 :(得分:7)

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

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

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