Метод AnimationTimer
handle()
вызывается для каждого «импульса», т. Е. Каждый раз, когда воспроизводится кадр. По умолчанию инструментарий JavaFX будет пытаться делать это 60 раз в секунду, но это никоим образом не гарантируется. Его можно изменить, установив системное свойство, и возможно, что будущие версии JavaFX будут пытаться выполнять импульсы чаще. Если поток приложения FX выполняет большой объем работы, то импульсы могут возникать реже, чем целевая частота. Следовательно, код в вашем методе handle()
должен учитывать количество времени, прошедшее с момента последнего обновления.
Параметр, переданный методу handle(...)
, представляет текущее системное время в наносекундах. Итак, типичный способ подойти к этому:
AnimationTimer h = new AnimationTimer() {
private long lastUpdate ;
private double speed = 50 ; // pixels per second
@Override
public void start() {
lastUpdate = System.nanoTime();
super.start();
}
@Override
public void handle(long now) {
long elapsedNanoSeconds = now - lastUpdate ;
double elapsedSeconds = elapsedNanoSeconds / 1_000_000_000.0 ;
// ...
snake[0].setY(snake[0].getY() + elapsedSeconds * speed);
// ...
lastUpdate = now ;
}
}