更改另一个类中的静态变量的值

问题描述:

我试图显示一个字符在屏幕上移动,但x和y变量保持不变。我的印象是,当我改变一个静态变量的值时,它在每个类的实例中都会改变。更改另一个类中的静态变量的值

这里是指移动字符

public class MoveChara { 
private static int x, y; 
private int dx, dy; 

public void init() { 
    x = 30; 
    y = 50; 
    dx = 1; 
    dy = 1; 
} 

public void move() { 
    x += dx; 
    y += dy; 
} 

public int getX() { 
    return x; 
} 

public int getY() { 
    return y; 
} 
} 

这里是调用Move方法

public class Game implements Runnable { 
private MoveChara move; 
private boolean running = false; 

public void run() { 
    init(); 

    while(running) { 
    tick(); 
    render(); 
    } 
    stop(); 
} 

private void init() { 
    move = new MoveChara; 
} 

private void tick() { 
    move.move(); 
} 
} 

和阶级的一部分类在绘制字符的方法

public class Draw extends JPanel { 
public MoveChara move; 
public ImageMake imgm; 

@Override 
public void paintComponent(Graphics g) { 
    imgm = new ImageMake(); 
    super.paintComponent(g); 
    Graphics2D g2d = (Graphics2D) g; 

    move = new MoveChara(); 
    move.init(); 
    g2d.drawImage(
    imgm.createImg("Images/SpriteSheet.png"), 
    move.getX(), 
    move.getY(), 
    this 
); 
} 
} 
+0

如果您还没有,请在您的方法中添加一些日志语句以(1)确认它们正在被调用并(2)检查值。 – DavidS

+0

静态变量属于类而不是单个实例,所以它在每个实例中都不会改变 - 它只存在于一个地方。它可能会在每一个例子中出现变化,但那是因为只有一个变量。 – Matthew

+0

您在Game.init中有错误。该行应该读为'move = new MoveChara();' - 你缺少括号。 – Matthew

一个静态变量属于该类而不属于该类的一个实例。 要访问一个静态变量从它的类以外,你可以做这样的:

claasName.variablename = newValue; 

里面paintComponent方法有对父类的init方法的调用,这是初始化x和y每次它叫做。如果你将初始化移动到静态变量声明,这个工作就可以了。 让我知道,如果这是你正在寻找。

+0

这不回答这个问题。他说:“我试图显示一个在屏幕上移动的角色,但x和y变量保持不变。”即使有了静态变量,如果他编码正确,他仍然应该看到他的角色移动。 – DavidS

+2

我编辑了我的答案,补充信息应该可以解决问题。 – goncalopinto

静态变量在类的实例间共享。编辑后,它们会更改所有实例。

+2

这并不回答这个问题。他说:“我试图显示一个在屏幕上移动的角色,但x和y变量保持不变。”即使有了静态变量,如果他编码正确,他仍然应该看到他的角色移动。 – DavidS

+1

这真的没有回答这个问题。事实上马修的评论甚至比你的回答更好,即, “静态变量属于......但那是因为只有一个变量。” – Tacocat