JavaFX中抛物线轨迹的时间线
对不起,我继续不理解。 我的问题是我对物理学一无所知,但我的老师给了我这个项目。
private void shoot() { Group group = new Group(); double angle = cannon.getRotate(); double speed = slider.getValue(); double x = cannon.getLayoutX(); double y = cannon.getLayoutY(); double v0X = Math.cos(angle)*speed; double voY = Math.sin(angle)*speed; Circle c = new Circle(x, y, 8, Color.BLACK); /*t is the time, but I don't know its value or has it the same value of the KeyFrame duration? */ double x2 = x + voX*t; double y2 = y + v0Y * t - 0.5 * gravity * t * t; Line l = new Line(x, y, x2, y2); l.setStroke(Color.BLACK); group.getChildren().addAll(c, l); final Timeline timeline = new Timeline(); KeyValue xKV = new KeyValue(c.centerXProperty(), x2); KeyValue yKV = new KeyValue(c.centerYProperty(), y2 , new Interpolator() { @Override //Maybe I need I splite, not a curve (?) protected double curve(double t) { //thisshould be trajectory's formula return Math.tan(angle) * x*-(gravity/(2*speed*Math.cos(angle)))*x*x; } }); KeyFrame xKF = new KeyFrame(Duration.millis(2000), xKV); KeyFrame yKF = new KeyFrame(Duration.millis(2000), yKV); timeline.getKeyFrames().addAll(xKF, yKF); timeline.play(); }
我处于停滞状态。 请帮助我
在KeyValue
,第一个参数应该是WritableValue
,例如circle.centerXProperty()
,它表示初始坐标,比如x
。 第二个参数应该是类型兼容值,在这种情况下是射弹应该移动的x
坐标。 随着时间轴的播放, WritableValue
将相应更新。 添加第二个KeyValue
以驱动y
坐标。
在此处看到的第一个示例中, KeyValue
三个实例将图形从其初始位置移动到其目标位置,该位置是沿每个坐标轴的size
单位。 在该相关示例中 ,图形从点p1
移动到p2
。
在下面的示例中, Circle
与x
轴平行移动,介于100
和500
之间。 同时,同一个Circle
沿着由抛物线y = -4( x – ½) 2 + 1定义的curve()
平行于y
轴在300
和100
之间移动,其具有顶点(½,1)和x截取0和1.这个curve()
模拟了一个单位正方形上的抛物线路径,如curve()
API所要求的那样。 您可以通过更改关键帧中高度与宽度的比例来更改高程角度,例如
KeyValue xKV = new KeyValue(c.centerXProperty(), 200); KeyValue yKV = new KeyValue(c.centerYProperty(), 0, new Interpolator() {…});
import javafx.animation.Interpolator; import javafx.animation.KeyFrame; import javafx.animation.KeyValue; import javafx.animation.Timeline; import javafx.application.Application; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Line; import javafx.stage.Stage; import javafx.util.Duration; /** * @see https://stackoverflow.com/a/38031826/230513 */ public class Test extends Application { @Override public void start(Stage primaryStage) { primaryStage.setTitle("Test"); Group group = new Group(); Scene scene = new Scene(group, 600, 350); scene.setFill(Color.BLACK); primaryStage.setScene(scene); primaryStage.show(); Circle c = new Circle(100, 300, 16, Color.AQUA); Line l = new Line(100, 300, 500, 300); l.setStroke(Color.AQUA); group.getChildren().addAll(c, l); final Timeline timeline = new Timeline(); timeline.setCycleCount(Timeline.INDEFINITE); timeline.setAutoReverse(false); KeyValue xKV = new KeyValue(c.centerXProperty(), 500); KeyValue yKV = new KeyValue(c.centerYProperty(), 100, new Interpolator() { @Override protected double curve(double t) { return -4 * (t - .5) * (t - .5) + 1; } }); KeyFrame xKF = new KeyFrame(Duration.millis(2000), xKV); KeyFrame yKF = new KeyFrame(Duration.millis(2000), yKV); timeline.getKeyFrames().addAll(xKF, yKF); timeline.play(); } public static void main(String[] args) { launch(args); } }