JavaFx AnimationTimer()速度

时间:2018-05-14 19:02:42

标签: animation javafx timer javafx-8

我试图改变动画计时器的速度,以便代码运行得更慢,这是我到目前为止的代码。

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 :(得分:1)

在每个&#34;脉冲&#34;上调用AnimationTimer的{​​{1}}方法。 - 即每次渲染帧时。默认情况下,JavaFX工具包将尝试每秒执行60次,但这并不能保证。可以通过设置系统属性来更改它,并且未来版本的JavaFX可能会尝试更频繁地执行脉冲。如果FX应用程序线程有大量工作要做,那么脉冲的发生频率可能​​低于目标速率。因此,handle()方法中的代码需要考虑自上次更新以来的时间量。

传递给handle()方法的参数表示当前系统时间(以纳秒为单位)。因此,解决此问题的典型方法是:

handle(...)

答案 1 :(得分:1)

您可以使用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);