我得到了一个ArrayIndexOutOfBounds异常,我不知道为什么。有人可以解释一下吗?

时间:2015-02-28 19:45:35

标签: java libgdx collision-detection

这是我第一次制作2D游戏。代码是Java。

我有一个可以在僵尸身上射击的角色,这就是我在爆炸和僵尸之间进行碰撞检测的方法。

我收到了一行的ArrayIndexOutOfBounds异常:blastIter.remove();

为什么?

Iterator<Rectangle> blastIter = blasts.iterator();
Iterator<Zombie> zombieIter;

while(blastIter.hasNext()) {
    Rectangle blast = blastIter.next();
    blast.x += 200 * Gdx.graphics.getDeltaTime();
    if(blast.x > window.length) blastIter.remove();

    zombieIter = zombies.iterator();
    while(zombieIter.hasNext()) {
        Zombie zombie = zombieIter.next();
        if(zombie.overlaps(blast)) {
            zombie.removeHealth(5);
            blastIter.remove();
            if (zombie.isDead()) {
                zombiesSlain++;
                zombieIter.remove();
            }
        }
    }
}

根据要求,这是完整的堆栈跟踪:

线程中的异常&#34; LWJGL应用程序&#34; java.lang.ArrayIndexOutOfBoundsException:-1     在com.badlogic.gdx.utils.Array.removeIndex(Array.java:231)     at com.badlogic.gdx.utils.Array $ ArrayIterator.remove(Array.java:540)     在com.test.drop.Drop.render(Drop.java:128)     在com.badlogic.gdx.backends.lwjgl.LwjglApplication.mainLoop(LwjglApplication.java:208)     在com.badlogic.gdx.backends.lwjgl.LwjglApplication $ 1.run(LwjglApplication.java:114)

1 个答案:

答案 0 :(得分:3)

在内循环中使用blastIter.remove();是有问题的,因为您可能会尝试多次删除相同的爆炸。另外,你可以在进入内循环之前移除爆炸,在这种情况下应该跳过内循环。

我建议添加一个标志,以防止爆炸被多次移除:

while(blastIter.hasNext()) {
    Rectangle blast = blastIter.next();
    blast.x += 200 * Gdx.graphics.getDeltaTime();
    boolean removed = false;
    if(blast.x + 16 > window.length) {
        blastIter.remove();
        removed = true;
    }
    zombieIter = zombies.iterator();
    while(zombieIter.hasNext() && !removed) {
        Zombie zombie = zombieIter.next();
        if(zombie.overlaps(blast)) {
            removed = true;
            zombie.removeHealth(5);
            blastIter.remove();
            if (zombie.isDead()) {
                zombiesSlain++;
                zombieIter.remove();
            }
        }
    }
}