我正在使用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();
}
基本上,循环功能决定角色是否需要移动,如果是,则移动它。
答案 0 :(得分:0)
很难让Java作为实时系统工作......因为未知因素,例如操作系统将安排您的进程运行和GC。由于您尝试以200 fps更新游戏(如果我的数学运算正确),您可能需要尝试以下方法。为了让游戏更顺畅,我会尝试找到当前事件被触发和最后一个事件之间的时间,现在理论上可能是5ms但有时它将是7ms(超级慢),有时它将是3ms(超级快速) )。你有两个事件之间的时间,我会计算动画应该在哪里,所以如果时间是3毫秒,那么动画将在5毫秒时间之前。让我们举一个简单的例子,你试图每5ms更新一次图像的X位置。
//your current code
newX = X + 5px
//new code
//this wont always be 5ms
timeDiff = currentEventTime – lastEventTime;
newX = X + 5px (timeDiff/5ms)