修改动画JavaFX的时间(Timeline + Interpolator)
Modify time of animation JavaFX (Timeline + Interpolator)
最近看了一堂关于JAVAFX的课,想做一个应用来吸收所学。
我想做一个 2D 游戏,其中一个球是通过抛物线方式动画的。
我正在为这两个对象使用 Timeline
和 Interpolator
。
我必须承认我不知道 Interpolator
到底是如何工作的,我的问题是我想让动画在球到达 window 底部时停止。
我考虑过使用 2 种方法:
- 第一个包括当球的 Y 坐标 (
Circle
) 大于或等于 windows 的高度时停止动画,但我不知道如何这样做。
- 第二个包括在特殊时刻停止动画
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;
}
}))
);
编辑:
好的,你给我的link我都看了,现在我明白了KeyValue
的第二个参数是endValue
!
现在看这个例子,我将 (X,Y) 的结束值设置为 (500,700),但是看看我在打印 centerXProperty 和 centerYProperty 的值时在控制台中得到的结果:
这是我的新代码:
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。
最近看了一堂关于JAVAFX的课,想做一个应用来吸收所学。
我想做一个 2D 游戏,其中一个球是通过抛物线方式动画的。
我正在为这两个对象使用 Timeline
和 Interpolator
。
我必须承认我不知道 Interpolator
到底是如何工作的,我的问题是我想让动画在球到达 window 底部时停止。
我考虑过使用 2 种方法:
- 第一个包括当球的 Y 坐标 (
Circle
) 大于或等于 windows 的高度时停止动画,但我不知道如何这样做。 - 第二个包括在特殊时刻停止动画
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;
}
}))
);
编辑:
好的,你给我的link我都看了,现在我明白了KeyValue
的第二个参数是endValue
!
现在看这个例子,我将 (X,Y) 的结束值设置为 (500,700),但是看看我在打印 centerXProperty 和 centerYProperty 的值时在控制台中得到的结果:
这是我的新代码:
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。