所以基本上我想做的是让一个boss生成(曾经是10个关卡),并删除屏幕上的其他敌人。所有对象都在链接列表中,并扩展了游戏对象。
在游戏对象中,我删除了布尔值,并且:
public GameObject(float x, float y, ID id) {
this.x = x;
this.y = y;
this.removed = removed;
this.id = id;
}
在我拥有的处理程序中,从上一个线程中得出另一个建议:
for (int i = 0; i < object.size(); i++) {
if (object.get(i).removed == true)
object.remove(i);
}
我检查关卡和移除敌人的方式是(基本敌人行 41)这是在基本敌人类中:
if(hud.level % 10 == 0) {
this.removed = true;
}
每次我运行代码并在其中生成一个敌人时,都会在基本敌人的第 41 行抛出一个 nullPointerException。完全错误是:
Exception in thread "Thread-0" java.lang.NullPointerException
at BasicEnemy.tick(BasicEnemy.java:41)
at Handler.tick(Handler.java:13)
at Game.tick(Game.java:92)
at Game.run(Game.java:73)
at java.base/java.lang.Thread.run(Thread.java:844)
int 级别是公共的,在开始时设置为 1
我不太擅长LinkedLists,所以这是非常令人困惑的atm。
编辑
HUD.级别是
public int level = 1;
HUD是跟踪叠加层,当前级别和分数的类,用于增加分数和级别的代码是:
public void tick() {
HEALTH = Game.clamp(HEALTH, 0, 100);
greenValue = Game.clamp(greenValue, 0, 255);
greenValue = HEALTH * 2;
score++;
}
水平:
public void tick() {
scoreKeep ++;
if(scoreKeep >= 100) {
scoreKeep = 0;
hud.setLevel(hud.getLevel() + 1);
既然你叫this.removed = true;
,我们知道这是一个boolean
或Boolean
。我
public GameObject(float x, float y, ID id) {
this.x = x;
this.y = y;
this.removed = removed; // ####
this.id = id;
}
但是您没有removed
参数,因此它与this.removed = this.removed
相同或与不执行相同。
现在,removed
类型有两种可能性:。
boolean
默认false
- a
Boolean
,默认null
如果这是Boolean
,调用object.get(i).removed == true
将触发NullPointerException
(因为从Boolean
到boolean
的出局拳击)。
仅供参考:
删除每个标志值的循环可以更改为使用Collection.removeIf
,该谓词(此处为返回布尔值的 getter)删除每个标记的项目(该方法迭代集合)
object.removeIf(GamObject::isRemoved)
假设您在GameObject
中有一个吸气public boolean isRemoved()
.