我正在用Java开发2D平台,并且正在使用Swing计时器,它的间隔设置为5毫秒。但是,有时它会以良好的速度平稳地运动,但随后它会变得非常快,有时甚至会变得非常慢。这可能是什么原因?
码:
public Board() {
addKeyListener(new KeyListener());
setFocusable(true);
setBackground(new Color(204,250,255));
//draws the object off the screen in memory, then brings it in
setDoubleBuffered(true);
...(other code not relevant)...
timer = new Timer(5, this);
timer.start();
}
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2d = (Graphics2D) g;
//draw platform
for(int i = 0; i < platform.length; i++) {
//g2d.setColor(new Color(0,0,0));
//g2d.drawRect(platform[i].getX(), platform[i].getY(), platform[i].getWidth(), platform[i].getHeight());
g2d.drawImage(platform[i].getImage(), platform[i].getX(), platform[i].getY(), this);
}
//draw guy
g2d.drawImage(guy.getImage(), guy.getX(), guy.getY(), this);
//destroy unneeded process
Toolkit.getDefaultToolkit().sync();
g.dispose();
}
基本上,循环功能决定角色是否需要移动,如果需要则移动它。
最佳答案
很难使Java作为实时系统工作。由于未知因素,例如操作系统何时安排您的进程运行和GC。由于您尝试以200 fps(如果我的数学正确)更新游戏,因此您可能需要尝试以下方法。为了使游戏更流畅,我将尝试查找当前事件和最后一个事件之间的时间,现在理论上可能是5毫秒,但有时会是7毫秒(超慢),有时会是3毫秒(超快) )。您有两个事件之间的时间,我将计算动画的位置,因此,如果时间是3ms,则动画将比5ms时间早一点。让我们举一个简单的示例,其中您尝试每5ms更新5像素的图像的X位置。
//your current code
newX = X + 5px
//new code
//this wont always be 5ms
timeDiff = currentEventTime – lastEventTime;
newX = X + 5px (timeDiff/5ms)