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

时间:2016-07-09 22:05:50

标签: javafx 2d

我最近读了一篇关于JAVAFX的课程,我想要一个应用程序来同化我学到的东西。 我想做一个2D游戏,其中一个球通过抛物线方式进行动画制作。 我正在使用这两个对象TimelineInterpolator。 我必须承认,我不知道Interpolator的工作原理是什么,我的问题是当球到达窗户底部时,我想让动画停止。

我考虑过使用两种方法:

  • 第一个包括当球的Y坐标(Circle)大于或等于窗户的高度时停止动画,但我不知道如何做到这一点
  • 第二个包括在特殊时刻Tf停止动画,我得到一个公式,知道球何时与目标相交,但我不知道如何定义一个结束时间动画。

如果可能,我想对这两种方法做出回应:) 这是我的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;
        }
    }))
);

修改

好的,我在你给我的链接上阅读了所有内容,我现在明白了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();

2 个答案:

答案 0 :(得分:1)

对于这样的事情,我发现使用AnimationTimer比使用时间轴更灵活。使用AnimationTimer,您可以直接实现两种基本方法。你要么只是调用计时器的停止方法,要么在你的计时器方法中,你只是在达到最终状态时停止推进球。

答案 1 :(得分:1)

  

我希望当球到达窗口底部时停止动画。

从完整的example开始,只需将周期数设置为1,即默认值。

timeline.setCycleCount(1);

在飞行中:

image during

登陆:

image end

可以看到代数等价的抛物线Interpolator here