如何在JavaFX中更改AnimationTimer的速度?

如何在JavaFX中更改AnimationTimer的速度?,animation,javafx,timer,javafx-8,Animation,Javafx,Timer,Javafx 8,我正在尝试更改动画计时器的速度,以使代码运行得更慢,以下是我迄今为止的代码: AnimationTimer timer=新的AnimationTimer(){ @凌驾 公共无效句柄(长现在){ 如果(向上向下!=1){ 对于(int i=0;i

我正在尝试更改
动画计时器的速度,以使代码运行得更慢,以下是我迄今为止的代码:

AnimationTimer timer=新的AnimationTimer(){
@凌驾
公共无效句柄(长现在){
如果(向上向下!=1){
对于(int i=0;i<4;i++){
snakePositionDown[i]=snake[i].getX();
snakePositionDownY[i]=snake[i].getY();
}
snake[0].setY(snake[0].getY()+25);
对于(int i=1;i<4;i++){
snake[i].setX(snakePositionDown[i-1]);
蛇[i].setY(蛇[i-1]);
}
左向右=2;
upOrDown=0;
}
}
};
timer.start();
如何使
AnimationTimer
运行得更慢


提前谢谢

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

传递给
句柄(…)
方法的参数表示当前系统时间(以纳秒为单位)。因此,一种典型的方法是:

AnimationTimer h=新的AnimationTimer(){
private long lastUpdate;//上次调用“handle()”的时间
private double speed=50;//蛇每秒移动50像素
@凌驾
公开作废开始(){
lastUpdate=System.nanoTime();
super.start();
}
@凌驾
公共无效句柄(长){
long elapsedNanoSeconds=now-lastUpdate;
//1秒=100000000(十亿)纳秒
双延时秒=延时纳秒/1_000_000_000.0;
// ...
snake[0].setY(snake[0].getY()+elapsedSeconds*速度);
// ...
lastUpdate=now;
}
}

为此,您可以使用
时间线。调整时间线。速率属性也允许您更新“速度”:

//每秒更新一次(只要速率保持为1)
时间线=新时间线(新关键帧)(持续时间。秒(1),事件->{
如果(向上向下!=1){
对于(int i=0;i<4;i++){
snakePositionDown[i]=snake[i].getX();
snakePositionDownY[i]=snake[i].getY();
}
snake[0].setY(snake[0].getY()+25);
对于(int i=1;i<4;i++){
snake[i].setX(snakePositionDown[i-1]);
蛇[i].setY(蛇[i-1]);
}
左向右=2;
upOrDown=0;
}    
}));
timeline.setCycleCount(Animation.unfinite);
timeline.play();
...
//双速
时间线。设定值(2);
// 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);