作为序言,我搜索了论坛,但没有发现与我的具体情况有关的信息。我大约一个星期前才开始学习Java,这是我首次涉足面向对象编程。

我正在开发一个基本游戏(在机制方面,想像太空入侵者)。我有一个“投射物”类,一个“ FallingThings”类(这是我为掉落的对象(金钱,朋友,敌人)所拥有的类的父类)。射击的每个射弹都存储在ArrayList中,Money,Friend和Enemy的每个实例也存储在它们各自的ArrayList中。

当我实现碰撞检测时,就会发生问题。首先,它需要多个子弹才能使碰撞机制起作用(我想我在这里可能只是弄乱了一些数字,但我不确定100%)。现在,有时在我发射多发子弹(并且它们早已消失)之后,无需我再发射另一颗子弹就可以检测到碰撞,并且FallingThings对象从屏幕上消失了。同样,在其他时间,多个对象会一次消失。最奇怪的是,所有这些都是不一致的,并且并非总是以相同的方式再现。但是,我与玩家角色的碰撞效果很好。

有人对我该如何解决这个问题有一些想法吗?我的代码如下:

“ FallingThings”类中的方法(ArrayLists在StartingClass(主类)中定义)。

   public void checkBulletCollision(Rectangle rectangle) {

    for (int j = 0; j < Character.getProjectiles().size(); j++) {
        Projectile p = (Projectile) Character.getProjectiles().get(j);
        if (p.isVisible() == true) {

            for (int i = 0; i < StartingClass.getMoneys().size(); i++) {
                Money m = (Money) StartingClass.getMoneys().get(i);
                if (m.getR().intersects(rectangle)) {
                    m.remove(i);
                    System.out.println("bullet collision");
                }
            }
            for (int i = 0; i < StartingClass.getEnemies().size(); i++) {
                Enemy e = (Enemy) StartingClass.getEnemies().get(i);
                if (e.getR().intersects(rectangle)) {
                    e.remove(i);
                }
            }
            for (int i = 0; i < StartingClass.getFriends().size(); i++) {
                Friend f = (Friend) StartingClass.getFriends().get(i);
                if (f.getR().intersects(rectangle)) {
                    f.remove(i);
                }
            }
        }
    }
}


我的弹丸更新方法:

public void update() {
    y -= speedY;
    if (y < 0) {
        visible = false;
    }
    rectangle.setBounds(getRectangle());
}


我整天都在尝试解决此问题,但仍然无法正确实施。我曾尝试使用ListIterator,但这导致程序冻结并引发类型转换错误。

非常感谢你的帮助! =)

最佳答案

我怀疑您遇到了问题,因为在遍历该列表时正在按索引从列表中删除项目。删除项目会导致索引计数器失去控制。尝试使用实际的Iterator。甚至无需考虑索引。 Iterator具有针对这些情况的remove方法。

Iterator<Enemy> iterator = StartingClass.getEnemies().iterator();
while (iterator.hasNext()) {
    Enemy e = iterator.next();
    if (e.getR().intersects(rectangle)) {
        iterator.remove();
    }
}

07-24 13:35