Java 一次一个摆动计时器?

Java 一次一个摆动计时器?,java,swing,animation,timer,actionlistener,Java,Swing,Animation,Timer,Actionlistener,我正在使用一个摆动计时器在我的游戏中设置人物移动的动画。 如果我从一个点发送到另一个点,效果很好,但是当我多次调用它时,动画速度就会增加 我认为它必须以这种方式工作,但是我是否可以“叠加”计时器,以便仅在当前动画完成时才开始升级 这不是确切的代码,但工作原理如下: Timer timer = new Timer(40, new ActionListener() { public void actionPerformed(ActionEvent e) {

我正在使用一个摆动计时器在我的游戏中设置人物移动的动画。 如果我从一个点发送到另一个点,效果很好,但是当我多次调用它时,动画速度就会增加

我认为它必须以这种方式工作,但是我是否可以“叠加”计时器,以便仅在当前动画完成时才开始升级

这不是确切的代码,但工作原理如下:

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();
Timer Timer=新定时器(40,新ActionListener(){
已执行的公共无效操作(操作事件e){
如果(图.x!=target.x){
如果(图x
对于不是基本动画速率倍数的每个不同时段,使用单独的实例。所有实例共享一个公共队列。通常只需要几个;25左右是一个实际限制。

这里有几件事可以做:

  • 一直运行计时器(大部分时间它什么也不做,除非目标发生变化)简单易懂,如果很多东西同时移动,效率会比较低,但对于少量动画来说可能还可以
  • 让你的动作以时间为基础(即,不要每次计时器滴答滴答地移动一个“像素”),计划你的目标目的地和到达时间,然后当计时器滴答滴答地响时,计算你的身材“现在”应该在哪里,然后把他移到那里
  • 在对象上附加一个volatile标志,让您知道他已经附加了一个计时器,这样您就不会在同一个对象上附加多个计时器

旁白:没有办法按照您的想法“排队”计时器,一次只显示一个动画。您需要计时器之外的更多框架代码来实现这一点。(例如,使用链表来维护移动事件队列,当一个移动完成时,计时器任务会将下一个移动从队列中拉出并开始处理该移动。)

你能发布一些代码来演示加速行为吗?当然,我添加了一个简化的示例。谢谢!我想我会将其无限化,并在其他地方进行坐标更改。这只是一个爱好项目,所以效率还不是主要因素:)这展示了由单个计时器触发的“交错”更新的方法。