2017-06-17 251 views
0

我想製作水果籃遊戲。這裏的想法是,我想從屏幕頂部繪製水果到底部,我也想用timer.I嘗試幾種方法,但我沒有結果。這是我所做的,但它完全做錯了。設置遊戲計時器

Timer timer = new Timer(); 
while (getY() != 1500) { 
     timer.schedule(new DrawFruit(frame, g, x) { 
      @Override 
      public void run() { 

       g.drawImage(Toolkit.getDefaultToolkit().getImage(Panel.class.getResource(Consts.ImageResource.APRICOT_DIR)), 500, getY(), frame); 
       frame.repaint(); 
       setY(getY() + 30); 

      } 
     }, 0, 1000); 
    } 

和DrawFruit類

abstract class DrawFruit extends TimerTask { 
private JFrame jFrame; 
private Graphics g; 
private int x; 

public JFrame getJFrame() { 
    return jFrame; 
} 

public void setJFrame(JFrame jFrame) { 
    this.jFrame = jFrame; 
} 

public Graphics getG() { 
    return g; 
} 

public void setG(Graphics g) { 
    this.g = g; 
} 

public int getX() { 
    return x; 
} 

public void setX(int x) { 
    this.x = x; 
} 

public DrawFruit(JFrame frame , Graphics g , int x){ 
    setJFrame(frame); 
    setG(g); 
    setX(x); 
} 


@Override 
public void run() { 

} 

}

+0

歡迎來到Stack Overflow!尋求調試幫助的問題(「爲什麼這個代碼不工作?」)必須在問題本身中包含所需的行爲,特定的問題或錯誤以及必要的最短代碼**。沒有明確問題陳述的問題對其他讀者無益。請參閱:[如何創建最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 –

+0

你在做什麼會導致問題的發展......基於計時器的解決方案對於動畫循環來說是一個天真的實現。我強烈建議您查看** Delta-Time循環**,以及它們爲什麼用於動畫。 – XenoRo

回答

1

你不應該使用循環的代碼。定時器的一點是它取代了循環。一個定時器所做的就是在指定的時間間隔內生成一個事件。所以當事件產生時,只需調整「Y」值並重新繪製組件。

但是,你不應該爲此使用TimerTask。

擺動部件應在Event Dispatch Thread (EDT)上更新。因此您應該使用Swing Timer。閱讀本教程以獲取有效的示例,幫助您入門。