保持计时器事件等间隔

时间:2014-05-23 19:59:38

标签: java swing timer consistency

我试图在我正在开发的游戏中制作动画。动画的工作原理是将按钮大小设置得非常小,然后再将其逐渐增大到正常大小。我有它的工作,除了我有时间问题。

有时按钮几乎会立即增长,有时会非常缓慢。我正在寻找中间的东西,我需要它始终以这么大的速度增长,而不是有时候快速增长。

我已经查看了它,我发现了这个伪代码:

distance_for_dt = speed * delta_time
new_position = old_position + distance_for_dt

不幸的是,我不明白所说的内容,而且我也不知道如何将其应用到我的代码中。任何人都可以帮助解释或解释上述伪代码中的内容吗?

我的计时器代码timer已在上面定义为Timer,而z []只是一对坐标:

timer = new Timer(18, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                Dimension dim = button[z[0]][z[1]].getSize();
                if (dim.getHeight() < 79.9) {
                    button[z[0]][z[1]].setSize((int) (dim.getWidth() + 6), (int) (dim.getHeight() + 6));
                } else {
                    button[z[0]][z[1]].setSize(80, 80);
                    timer.stop();
                }
            }
        });
        timer.start();

1 个答案:

答案 0 :(得分:0)

根据您在Swing应用程序上调用的更新次数,可能会“备份”并减慢速度。例如,如果你想在没有Timer的情况下完成动画,你可以这样做:

// example method to do animation
public void animateButton(final int wait){
    Thread thread = new Thread(){
        public void run(){
            // some loop structure to define how long to run animation
            Dimension dim = button[z[0]][z[1]].getSize();
            while (dim.getHeight() < 79.9){
                SwingUtilities.invokeLater(new Runnable(){
                        //update Swing components here
                    });
                    try{ Thread.Sleep(wait); }
                    catch(Exception e){}
                }
            }
        }
    }
    thread.start();
}

我认为这可能类似于Timer如何更新GUI,因为Timers在一个单独的线程上运行。我会研究是否需要在invokeLater(new Runnable)内使用timer来正确安排任务。我必须这样做才能允许我正在进行的项目在长期任务中保持响应。如果您确实需要确保速度并且可能需要DROP更新来调整系统滞后,那么您需要使用System.currentTimeMillis()之类的方法调用来计算动画的完整程度与已经过了多少时间。 System.nanoTime()。然后,针对动画的每个步骤进行相应调整。