java - 太空入侵者 ArrayList IndexOutOfBoundsException

标签 java swing 2d-games

好吧,我已经搜索了这个错误,发现原因可能是我对 Arraylist 的更新与我的 repaint() 方法发生了某种冲突。我已经多次更改代码试图修复它,但要么无法编译,要么最终出现完全相同的错误。 我正在创建太空入侵者,游戏运行良好,直到我快速射击(即点击向上按钮快速),然后出现此错误: (注意:“Index: x, Size: x”中的 x 并不总是 1,它的范围是 1 到 6)

Exception in thread "AWT-EventQueue-0" java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at Board.checkCollisions(Board.java:185)
at Board.actionPerformed(Board.java:172)
at javax.swing.Timer.fireActionPerformed(Timer.java:312)
at javax.swing.Timer$DoPostEvent.run(Timer.java:244)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:694)
at java.awt.EventQueue$3.run(EventQueue.java:692)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:703)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

这是似乎导致问题的代码部分。

        public void actionPerformed(ActionEvent e){
    if(enemies.size() == 0){
        ingame = false;
    }

    ArrayList ss = gun.getShots();

    for(int i = 0; i < ss.size(); i++){
        Shot s = (Shot) ss.get(i);
        if(s.isVisible()){
            s.move();
        }
        else{
            ss.remove(i);
        }
    }

    for(int i = 0; i < enemies.size(); i++){
        Enemy en = (Enemy) enemies.get(i);
        if(en.isVisible()){
            en.move();
        }
        else{
            enemies.remove(i);
        }
    }

    for(int i = 0; i < bunkers.size(); i++){
        Bunker b = (Bunker) bunkers.get(i);
        if(b.isVisible() == false){
            bunkers.remove(i);
        }
    }

    gun.move();
    checkCollisions();
    repaint();
}

public void checkCollisions(){

    ArrayList ss = gun.getShots();

    for(int i = 0; i < ss.size(); i++){
        Shot s = (Shot) ss.get(i);
        Rectangle r1 = s.getBounds();
        //Collision for Enemies
        for(int j = 0; j < enemies.size(); j++){
            Enemy en = (Enemy) enemies.get(i);
            Rectangle r2 = en.getBounds();

            if(r1.intersects(r2)){
                s.setVisible(false);
                en.setVisible(false);
            }
        }
        //Collision for Bunker
        for(int j = 0; j < bunkers.size(); j++){
            Bunker b = (Bunker) bunkers.get(i);
            Rectangle r2 = b.getBounds();

            if(r1.intersects(r2)){
                s.setVisible(false);
                b.setVisible(false);
                score++;
            }
        }

    }
}

更具体地说,这些代码行:

checkCollisions();
Enemy en = (Enemy) enemies.get(i);

有时

checkCollisions();
Bunker b = (Bunker) bunkers.get(i);

还有一个问题。由于某种原因,当我射击外星人或射击掩体时,我总是必须射击 ArrayList 中第一个的外星人,因为它也会消失。如果我先射击其他人,什么也不会发生,子弹就会飞过他们。这不是我最关心的问题,所以如果您不想浪费时间向我解释这一点,我理解。 提前致谢。

最佳答案

我猜这两个片段就是问题所在:

    for(int j = 0; j < enemies.size(); j++){
        Enemy en = (Enemy) enemies.get(i);


    for(int j = 0; j < bunkers.size(); j++){
        Bunker b = (Bunker) bunkers.get(i);

您使用 j 进行迭代,但在 getter 中使用 i

关于java - 太空入侵者 ArrayList IndexOutOfBoundsException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19625744/

相关文章:

java - 用Java读取文本文件并处理该文件

java - TestContainers 找不到有效的 Docker 环境

java - @PreUpdate 不适用于 Spring Data JPA

java - 将 JComboBox 的初始选定索引设置为 -1 或无

java - 事件委托(delegate)模型和事件继承模型有什么区别?

java - 尝试根据 double 绘制线条但没有显示?

java - Apache Beam 没有将无限数据保存到文本文件

java - 为什么 NetBeans 8.1 可以直接在编辑器中运行项目,但是当我将其编译成 jar 时,却出现错误

android - SurfaceView绘制性能

java - AffineTransform 不会在按键时移动图像