我正在用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)

09-27 02:29