在碰撞java

时间:2016-07-19 10:47:21

标签: java collision

我目前正在用java制作一个简单的2D游戏。我创建了一个控制器类,并为僵尸(敌人)和子弹创建了链接列表。然后在我的gameState类中,我尝试使用每个循环来遍历链接列表并检测是否与子弹和僵尸发生冲突。然而,在我的代码示例中,它的方式如下所示,只有敌人可以从游戏中删除,如果我也尝试删除子弹,游戏崩溃。我想知道是否可以在碰撞发生后如何删除两个实体。

这是子弹与敌人碰撞时得到的错误

Exception in thread "Thread-1" java.util.ConcurrentModificationException
at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
at java.util.LinkedList$ListItr.next(Unknown Source)
at android.game.GameState.update(GameState.java:71)
at android.game.Game.update(Game.java:121)
at android.game.Game.run(Game.java:101)
at java.lang.Thread.run(Unknown Source)

在GameState类中:

for(Zombie zombie : c.z)
    {
        if(player.getX() > zombie.getX()){
            zombie.setX(zombie.getX() + 1);
        }

        if(player.getX() < zombie.getX()){
            zombie.setX(zombie.getX() - 1);
        }

        if(player.getY() > zombie.getY()){
            zombie.setY(zombie.getY() + 1);
        }

        if(player.getY() < zombie.getY()){
            zombie.setY(zombie.getY() - 1);
        }

        if(player.getBounds().intersects(zombie.getBounds())){

            kills ++;
            c.removeZombie(zombie);
            System.out.println("kills" + kills);

        }

        for(Bullet bullet : c.b){
            if(zombie.getBounds().intersects(bullet.getBounds())){
                //c.removeBullet(bullet);
                c.removeZombie(zombie);
                kills++;

                System.out.println("kills" + kills);        
            }

        }

    }

控制器类:

public class Controller {

LinkedList<Bullet> b = new LinkedList<Bullet>();
LinkedList<Zombie> z = new LinkedList<Zombie>();

Bullet TempBullet;
Zombie TempZombie;

public Controller(){
    addZombie(new Zombie (200,600));
    addZombie(new Zombie (400,650));
}

public void tick(){
    for(int i = 0; i<b.size(); i++){
        TempBullet = b.get(i);

        TempBullet.tick();
    }

    for(int i = 0; i<z.size(); i++){
        TempZombie = z.get(i);

        TempZombie.update();
    }


}

public void draw(Graphics g){
    for(int i = 0; i < b.size(); i++){
        TempBullet = b.get(i);

        TempBullet.draw(g);
    }

    for(int i = 0; i < z.size(); i++){
        TempZombie = z.get(i);

        TempZombie.render(g);
    }

}

public void addBullet(Bullet block){
    b.add(block);
}

public void removeBullet(Bullet block){
    b.remove(block);
}

public void addZombie(Zombie block){
    z.add(block);
}

public void removeZombie(Zombie block){
    z.remove(block);
}
}

3 个答案:

答案 0 :(得分:3)

使用Iterator浏览您的列表,并使用remove()方法从您的集合中删除当前元素:

for(Iterator<Zombie> it = c.z.iterator(); it.hasNext(); ) {
    Zombie zombie = it.next();
    if (collisionWithBullet)
        it.remove();
}

答案 1 :(得分:1)

你不能使用a为每个循环检查与子弹的碰撞,然后同时删除相同的子弹。相反,您可以尝试标记要删除的项目符号,然后在每个循环的碰撞检测完成后将其删除。

答案 2 :(得分:1)

如果在执行for-each循环时删除元素,则会发生ConcurrentModificationException。解决此问题的一种方法是将循环更改为索引循环:

for (int i = c.z.size() - 1; i >= 0; i--) {
    Zombie zombie = c.z.get(I);

删除僵尸应该是安全的,而不必存储僵尸以在单独的集合中删除。