You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中无法向List添加Missile或绘制导弹矩形的问题求助

问题分析与修复方案

核心错误点

  1. AIShooter类List初始化语法错误
    原代码中List<Missile> missiles new ArrayList<>();缺少赋值符号=,编译直接失败,无法创建List实例,自然无法添加Missile对象。

  2. Missile类属性误用static修饰
    X、Y、Width、Height被定义为static,所有Missile对象共享这些值:

    • 新创建的导弹会覆盖静态属性值,导致所有导弹位置/尺寸完全一致
    • move()方法修改的是静态X,所有导弹会同步移动,视觉上只会看到一枚导弹
  3. draw方法逻辑混乱
    在遍历missiles的循环内调用aiShooter.fire(),会导致每次遍历都添加新导弹,循环次数异常增长,且新添加的导弹不会在当前帧被绘制;射击逻辑应该是按下按键时触发一次fire,而非遍历导弹时重复触发。


修正后的代码

1. AIShooter类(修复List初始化)

package testGames2;

import java.util.ArrayList;
import java.util.List;

public class AIShooter {
    public static int X = 200;
    public static int Y = 50;
    public static int Width = 10;
    public static int Height = 3;
    // 修复初始化语法错误
    List<Missile> missiles = new ArrayList<>();

    public List<Missile> getMissiles() {
        return missiles;
    }

    public void fire() {
        // 直接使用AIShooter的位置创建导弹,避免依赖Missile的静态属性
        missiles.add(new Missile(AIShooter.X, AIShooter.Y, AIShooter.Width, AIShooter.Height));
    }
}

2. Missile类(移除static修饰符)

package testGames2;

public class Missile {
    // 改为实例属性,每个导弹拥有独立的位置和尺寸
    public int X;
    public int Y;
    public int Width;
    public int Height;

    public Missile(int X, int Y, int Width, int Height) {
        this.X = X;
        this.Y = Y;
        this.Width = Width;
        this.Height = Height;
    }

    public void move() {
        // 修改当前实例的X属性,实现独立移动
        this.X += 10;
    }
}

3. draw方法(调整射击与遍历逻辑)

public void draw(Graphics2D gImages) {
    // 使用泛型避免强制类型转换
    List<Missile> missiles = aiShooter.getMissiles();

    // 射击逻辑:按下按键时仅添加一枚导弹
    if(keyH.shooting) {
        aiShooter.fire();
        // 可选:重置shooting状态,避免持续触发(根据你的输入逻辑调整)
        // keyH.shooting = false;
    }

    // 遍历所有导弹,执行移动与绘制
    for(Missile mis : missiles) {
        mis.move();
        gImages.fillRect(mis.X, mis.Y, mis.Width, mis.Height);
    }

    gImages.fillRect(X2, Y2, Width, Height);
    gImages.fillRect(X, Y, Width, Height);
}

修复说明

  • 每个Missile对象拥有独立的位置和尺寸,移动时不会互相干扰
  • 射击逻辑调整为单次触发,避免循环内重复添加导致的异常
  • 使用增强for循环简化遍历,通过泛型提升代码安全性

内容的提问来源于stack exchange,提问作者Reyni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:35:21