一次摆动计时器?

时间:2014-01-13 20:45:56

标签: java swing animation timer actionlistener

我正在使用挥杆计时器为我游戏中的数字动作制作动画。 如果我将它从一个点发送到另一个点,它工作正常,但是当我多次调用它时,动画速度会增加。

我认为它必须以这种方式工作,但是我可以“叠加”定时器,只在当前动画结束时启动升级吗?

这不是确切的代码,但是这样工作:

Timer timer = new Timer(40, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if(figure.x != target.x){
                    if(figure.x < target.x){
                        figure.x+1;
                      }else{
                    figure.x-1;
                }
        }
 }
});
timer.start();

2 个答案:

答案 0 :(得分:4)

您可以在此处执行以下操作:

  • 一直运行计时器(大多数情况下它什么都不做,除非目标发生变化)简单易懂,如果很多东西一次性移动,效率会适度低效,但可能只适用于少量动画。
  • 让您的动作基于时间(即,不是每次计时器滴答时移动一个'像素',计划您的目标目的地和到达时间,然后当计时器滴答时,计算您的位置数字应该是'现在'并将他移到那里。
  • 将易失性标记附加到您的对象,让您知道他已经连接了一个计时器,因此您不会将多个计时器附加到同一个对象。

除此之外:没有办法像你想象的那样'排队'计时器,一次显示一个动画。您需要更多计时器之外的框架代码。 (例如,使用链接列表来维护移动事件的队列,当一个移动完成时,计时器任务从队列中拉出下一个移动并开始处理...)

答案 1 :(得分:3)

对于不是基本动画速率倍数的每个不同时段,使用单独的javax.swing.Timer实例。所有实例共享一个公共队列。通常只需要少数几个; 25左右是实际限制。