Java 变量保持重置为默认值

Java 变量保持重置为默认值,java,variables,Java,Variables,我正在制作一个平台游戏,当玩家按下空格键时,它会射出一个火球,当火球与敌人相撞时,它会将生命值降低一,这很好,但随后会将其重置为初始值,我不知道为什么 敌级 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Enemy implements ActionListener{ private Image enemy; private int velocity=0; public int en

我正在制作一个平台游戏,当玩家按下空格键时,它会射出一个火球,当火球与敌人相撞时,它会将生命值降低一,这很好,但随后会将其重置为初始值,我不知道为什么

敌级

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Enemy implements ActionListener{
private Image enemy;
private int velocity=0;
public int enemyhp=3;
private int x=500,y=380;
private boolean isAlive = true;

public void paint(Graphics g){
    if(isAlive){
    g.drawImage(enemy, x, y, null);
    }
}

public Enemy(){
    Timer timer = new Timer(1000, this);
    timer.start();
}

public void update(){
    enemy = new ImageIcon("C:\\Users\\steven.greens10\\Desktop\\Programs\\Raw  Java\\Platform\\res\\enemy.png").getImage();

    if(enemyhp==0){
        die();
    }
    x+=velocity;


}


public void actionPerformed(ActionEvent event) {
    move();
    System.out.println(enemyhp);
}

private void move() {
    x-=5;
}

void addX(int speed){
    velocity=speed;
}

int getX(){
    return x;
}

int getY(){
    return y;
    }

int getWidth(){
    return 40;
}

int getHeight(){
    return 40;
}


public void takeDamage(){
enemyhp-=1;

}

public void die(){
    isAlive=false;
    x=100000;
    y=10000;
}

public void setX(){
    isAlive=true;
    x=500;
}
public void setY(){
    y=380;
}

}
检查火球和敌人是否发生碰撞以及是否发生碰撞的方法调用敌人类中降低生命值的函数

public void update(){

   if(isCollidingWithEnemy){
       enemy.takeDamage();
       isVisible=false;
       x=10000; y=10000;
   }

当我运行代码时,由于计时器的原因,会输出敌人的生命值,它显示为3,直到我射击敌人,然后显示为“2 3 3 2”

您可能会不小心周期性地用新实例替换对象。确保您只有一个
敌人
,并检查您调用
新敌人()的频率。

检查的一种方法是给每个对象一个唯一的名称或ID,并将其与当前的
enemyhp
一起打印出来。例如:

public class Enemy implements ActionListener {
    private static int nextID = 0;
    private final int id; /* final members must be set in the constructor and cannot be changed afterward */
    public int enemyhp=3;
    /* ... */

    public Enemy(){
        id = nextID++;
        /* ... */
    }

    public String toString() {
        return "Enemy " + id + ": enemyhp=" + enemyhp;
    }

    public void actionPerformed(ActionEvent event) {
        move();
        System.out.println(toString());
    }

    /* ... */
}

enemyhp
变量是公共变量;每个人都可以为此变量设置新值。我怀疑您在代码的其他地方强制将
enemyhp
的值设置为
3
将其标记为private,并创建getter/setter方法来访问它。然后,您将能够看到在何处设置此变量的值,并纠正这种情况。我注意到了一件小事,但将此
if(enemyhp==0){
更改为
if(enemyhp@Laf的想法和任何想法一样好。我看不出你的问题在发布的代码中。最好尽可能多地向外部类隐藏数据,以封装你的代码。此外,你还需要使用调试器来查看你的程序为什么会出现错误。你可能也会遇到线程问题。请确保你只有一个选项。)e
敌方
并检查调用
新敌方()的频率。
您可能会意外地定期使用新实例替换对象。检查的一种方法是为每个对象指定唯一的名称或ID,并将其与当前的
enemyhp
一起打印出来。