我有一个2D游戏,整个结构完全编码,除了图形。我只是更新JFrame的单个组件,它是一个包含50个图像的Graphic。每帧图像都在不同的位置,因此需要刷新率。
要绘制,我已经覆盖了paintComponent()方法,所以我真正需要做的就是每40ms重新绘制一个组件(再次,只是一个Graphic)。
如何设置25FPS的JFrame?
答案 0 :(得分:4)
刷新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的其他部分。
此致 斯特凡
答案 1 :(得分:2)
此AnimationTest
使用javax.swing.Timer
。 40 ms的周期将给出25 Hz的速率。
private final Timer timer = new Timer(40, this);
附录:计时器的ActionListener
通过调用repaint()
进行响应,随后调用被覆盖的paintComponent()
方法
@Override
public void actionPerformed(ActionEvent e) {
this.repaint();
}