Java中无法向List添加Missile或绘制导弹矩形的问题求助
问题分析与修复方案
核心错误点
AIShooter类List初始化语法错误
原代码中List<Missile> missiles new ArrayList<>();缺少赋值符号=,编译直接失败,无法创建List实例,自然无法添加Missile对象。Missile类属性误用static修饰
X、Y、Width、Height被定义为static,所有Missile对象共享这些值:- 新创建的导弹会覆盖静态属性值,导致所有导弹位置/尺寸完全一致
- move()方法修改的是静态X,所有导弹会同步移动,视觉上只会看到一枚导弹
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
相关产品推荐
相关产品推荐

