我有一個2D遊戲,整個結構是完全編碼,除了圖形。我只是更新一個包含50個圖像的Graphic的JFrame的單個組件。每幀圖像都在不同的位置,因此需要更新刷新率。如何設置刷新率的JFrame?
爲了繪製,我重寫了paintComponent()方法,所以我真正需要做的是每40毫秒重新繪製一次組件(它再次只是一個圖形)。
如何設置25FPS的JFrame?
我有一個2D遊戲,整個結構是完全編碼,除了圖形。我只是更新一個包含50個圖像的Graphic的JFrame的單個組件。每幀圖像都在不同的位置,因此需要更新刷新率。如何設置刷新率的JFrame?
爲了繪製,我重寫了paintComponent()方法,所以我真正需要做的是每40毫秒重新繪製一次組件(它再次只是一個圖形)。
如何設置25FPS的JFrame?
這AnimationTest
使用javax.swing.Timer
。 40毫秒的時間會產生25赫茲的速率。
private final Timer timer = new Timer(40, this);
附錄:計時器的ActionListener
響應通過調用repaint()
,隨後調用你的覆蓋paintComponent()
方法
@Override
public void actionPerformed(ActionEvent e) {
this.repaint();
}
這是一個壞主意,刷新一個JFrame。它是Swing中爲數不多的重要組件之一。最好的辦法是
你的標題有誤導之嫌,你做了正確的事情。
/** Thread running the animation. */
private class Runner extends Thread
{
/** Wether or not thread should stop. */
private boolean shouldStop = false;
/** Pause or resume. */
private boolean pause = false;
/** Invoke to stop animation. */
public void shouldStop() {
this.shouldStop = true;
}//met
/** Invoke to pause. */
public void pauseGame() { pause = true; }//met
/** Invoke to resume. */
public void resumeGame() { pause = false; }//met
/** Main runner method : sleeps and invokes engine.play().
* @see Engine#play */
public void run()
{
while(!shouldStop)
{
try {
Thread.sleep(6);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//catch
if(!pause)
{
engine.play();
gamePane.repaint();
}//if
}//while
}//met
/** Wether or not we are paused. */
public boolean isPaused() {
return pause;
}//met
}//class Runner (inner)
動畫會順利得多。並使用MVC和事件刷新UI的其他部分。
問候, 斯特凡
我猜你不想和每秒25幀更新一個JFrame,但它的一些內容。你使用Java3D嗎?你使用OpenGL嗎?什麼是顯示面板的父類(jpanel,widget,...)? – Hyperboreus 2011-06-07 04:58:53
這是一個廣泛的問題,如前所述,我認爲是無法回答的。 – 2011-06-07 05:02:13
@Hovercraft充滿鰻魚:現在應該足夠具體。告訴我是否需要更多細節。 – Will 2011-06-07 05:06:28