修改动画JavaFX的时间(Timeline + Interpolator)

Modify time of animation JavaFX (Timeline + Interpolator)

最近看了一堂关于JAVAFX的课,想做一个应用来吸收所学。 我想做一个 2D 游戏,其中一个球是通过抛物线方式动画的。 我正在为这两个对象使用 TimelineInterpolator。 我必须承认我不知道 Interpolator 到底是如何工作的,我的问题是我想让动画在球到达 window 底部时停止。

我考虑过使用 2 种方法:

如果可能的话,我希望对这两种方法都有回应:) 这是我的 Timeline 代码:

Timeline t1 = new Timeline();
t1.setAutoReverse(false);
t1.setCycleCount(Timeline.INDEFINITE);
t1.getKeyFrames().addAll(
    new KeyFrame(new Duration(1000 * Tf),new KeyValue(this.centerXProperty(),0,new Interpolator(){
        protected double curve(double t){
            double resultat = coeffAngleX * t;
            return - resultat;
        }
    })),
    new KeyFrame(new Duration(1000 * Tf),new KeyValue(this.centerYProperty(),0,new Interpolator(){
        protected double curve(double t) {
            double resultat = (a * t * t)
                     + (coeffAngleY * t);
            return resultat;
        }
    }))
);

编辑:

好的,你给我的link我都看了,现在我明白了KeyValue的第二个参数是endValue

现在看这个例子,我将 (X,Y) 的结束值设置为 (500,700),但是看看我在打印 centerXProperty 和 centerYProperty 的值时在控制台中得到的结果:

Result

这是我的新代码:

Timeline t1 = new Timeline();
t1.setAutoReverse(false);
t1.setCycleCount(1);

KeyValue xKvB = new KeyValue(this.centerXProperty(),xCenter);
KeyValue yKvB = new KeyValue(this.centerYProperty(),yCenter);

KeyValue xKvE = new KeyValue(this.centerXProperty(),500.0,new Interpolator(){
    protected double curve(double t){
        double resultat = coeffAngleX * t;
        System.out.println("X = " + centerXProperty().get());
        return resultat;
    }
});
KeyValue yKvE = new KeyValue(this.centerYProperty(),700.0,new Interpolator(){
   protected double curve(double t){
     double resultat = (a * t * t) + (coeffAngleY * t);
     System.out.println("Y = " + centerYProperty().get());
     return resultat;
   } 
});

KeyFrame KfB = new KeyFrame(Duration.ZERO,xKvB,yKvB);
KeyFrame KfE = new KeyFrame(Duration.seconds(1),xKvE,yKvE);


t1.getKeyFrames().addAll(KfB,KfE);
t1.play();

对于这样的事情,我发现使用 AnimationTimer 比使用时间轴更灵活。使用 AnimationTimer,您可以直接实现这两种基本方法。您要么只调用计时器的停止方法,要么在您的计时器方法内,当您达到结束条件时停止推进球。

I want to make the animation stop when the ball arrives at the bottom of the window.

从这个完整的 开始,只需将循环计数设置为默认值 1

timeline.setCycleCount(1);

飞行中:

登陆:

看到一个代数等价的抛物线 Interpolator here