2014-01-13 4 views
0

Я использую таймер поворота, чтобы оживить движение фигуры в моей игре. Он работает нормально, если я отправляю его с одной точки на другую, но когда я его называю несколько раз, скорость анимации складывается.Один таймер поворота сразу?

Я думаю, что он должен работать таким образом, но могу ли я «складывать» таймеры только для запуска, когда закончится текущая анимация?

Это не точный код, но работает так:

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(); 
+0

Можете ли вы опубликовать код, чтобы продемонстрировать ускорение поведения? –

+0

Несомненно, я добавил упрощенный пример. – Endanke

ответ

4

Есть несколько вещей, которые вы можете сделать здесь:

  • пробег таймер все время (большую часть времени он не делает ничего, если целевые изменения) Просто, чтобы понять, в меру неэффективной, если много вещей перемещение сразу, но, вероятно, хорошо для небольшого количества анимаций.
  • сделать ваши движения основаны на времени (т.е. вместо того, чтобы просто перемещаться на один «пиксель» каждый раз, когда таймер гаснет, планируйте свое целевое назначение и время прибытия, а затем, когда таймер тикает, подсчитайте, где ваша цифра должна быть правильной ' сейчас»и переместить его туда
  • придают летучий флаг к объекту, который позволяет вам знать, что он уже прикреплен таймер, так что вы не придаете несколько таймеров на тот же объект

Кроме..: нет возможности таймерам «очереди в очереди» так, как вы думаете, чтобы показать одну анимацию за раз. Для этого вам потребуется больше кода рамки за пределами таймеров (например, используйте связанный список для mainta в очереди событий движения, и когда одно движение заканчивается, задача таймера вытягивает следующее движение из очереди и начинает работать над этим.)

+1

Спасибо! Я думаю, что я сделаю это бесконечным и сделаю изменения координат в другом месте. Это просто хобби-проект, поэтому эффективность не является главным фактором :) – Endanke

+1

Этот [пример] (http://stackoverflow.com/q/18933986/230513) показывает приближение к «ошеломляющим» обновлениям, инициированным одним таймером. – trashgod

3

Используйте отдельный экземпляр javax.swing.Timer для каждого отдельного периода, который не является кратным фундаментальной скорости анимации. Все экземпляры имеют общую очередь. Обычно требуется лишь несколько человек; 25 или около того - практический предел.

Смежные вопросы