2016-03-02 145 views
0

我試圖顯示一個字符在屏幕上移動,但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

回答

5

一個靜態變量屬於該類而不屬於該類的一個實例。 要訪問一個靜態變量從它的類以外,你可以做這樣的:

claasName.variablename = newValue; 

裏面paintComponent方法有對父類的init方法的調用,這是初始化x和y每次它叫做。如果你將初始化移動到靜態變量聲明,這個工作就可以了。 讓我知道,如果這是你正在尋找。

+0

這不回答這個問題。他說:「我試圖顯示一個在屏幕上移動的角色,但x和y變量保持不變。」即使有了靜態變量,如果他編碼正確,他仍然應該看到他的角色移動。 – DavidS

+2

我編輯了我的答案,補充信息應該可以解決問題。 – goncalopinto

-2

靜態變量在類的實例間共享。編輯後,它們會更改所有實例。

+2

這並不回答這個問題。他說:「我試圖顯示一個在屏幕上移動的角色,但x和y變量保持不變。」即使有了靜態變量,如果他編碼正確,他仍然應該看到他的角色移動。 – DavidS

+1

這真的沒有回答這個問題。事實上馬修的評論甚至比你的回答更好,即, 「靜態變量屬於......但那是因爲只有一個變量。」 – Tacocat