JavaFx AnimationTimer () скорость - PullRequest
0 голосов
/ 14 мая 2018

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

AnimationTimer h = new AnimationTimer() {
    @Override
    public void handle(long now) {

        if (upOrDown != 1) {
            for (int i = 0; i < 4; i++) {
                snakePositionDown[i] = snake[i].getX();
                snakePositionDownY[i] = snake[i].getY();
            }
            snake[0].setY(snake[0].getY() + 25);
            for (int i = 1; i < 4; i++) {
                snake[i].setX(snakePositionDown[i - 1]);
                snake[i].setY(snakePositionDownY[i - 1]);
            }
            leftOrRight = 2;
            upOrDown = 0;
        }

    }
};
h.start();

Как бы я сделал этот бег медленнее. Спасибо

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Вы можете использовать Timeline для этой цели.Настройка свойства Timeline.rate также позволяет обновлять «скорость»:

// update once every second (as long as rate remains 1)
Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), event -> {

    if (upOrDown != 1) {
        for (int i = 0; i < 4; i++) {
            snakePositionDown[i] = snake[i].getX();
            snakePositionDownY[i] = snake[i].getY();
        }
        snake[0].setY(snake[0].getY() + 25);
        for (int i = 1; i < 4; i++) {
            snake[i].setX(snakePositionDown[i - 1]);
            snake[i].setY(snakePositionDownY[i - 1]);
        }
        leftOrRight = 2;
        upOrDown = 0;
    }    

}));
timeline.setCycleCount(Animation.INDEFINITE);
timeline.play();

...

// double speed
timeline.setRate(2);
0 голосов
/ 14 мая 2018

Метод 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 ;

    }
}
...