在JavaFX中创建移动点

时间:2019-02-23 15:41:27

标签: animation javafx timeline

我想编写一个在无限动画中在圆上移动的点,并且希望跟踪点的坐标以在动画中从它们画一条线。我已经用给定的radius创建了一个轨道(基本上是一个没有填充的圆形,只是笔划)。我尝试创建关键帧:

Timeline timeline = new Timeline();
    for(; theta < 2*Math.PI; theta += 0.5) {
        x = radius*Math.cos(theta);
        y = radius*Math.sin(theta);
        KeyFrame kf = new KeyFrame(Duration.millis(3000), new KeyValue(point.translateXProperty(), x),
                new KeyValue(point.translateYProperty(), y));
        timeline.getKeyFrames().add(kf);
    }

但是,这没有用,我找不到使用新的x和y坐标的方法。有人有更好的主意吗?

编辑: 这就是我创建轨道的方式

private void createOrbit(BorderPane root) {
    Pane pane = new StackPane();
    pane.setTranslateX(root.getWidth()/2);
    pane.setTranslateY(root.getHeight()/2);
    root.getChildren().add(pane);
    double radius = 100;
    Circle orbit = new Circle(radius, null);
    orbit.setStroke(Color.BLACK);
    pane.getChildren().add(orbit);
}

现在我想再画一个圆圈:

Circle point = new Circle(x,y,50,Color.BLACK);

其中x = radius * Math.cos(theta)y = radius * Math.sin(theta),都取决于角度theta。因此,我想创建一个动画,其中theta发生变化,并且将点重新绘制在轨道上的其他位置。 (即绕太阳公转的地球)

EDIT2:好的,所以我尝试了 AnimationTimer

package application;

import javafx.animation.*;
import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.*;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;

public class Main extends Application {
    double theta = 0;

public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) throws Exception {
    BorderPane root = new BorderPane();
    Scene scene = new Scene(root, 600, 600);

    Group group = new Group();
    group.setTranslateX(300);
    group.setTranslateY(300);

    double radius = 100;
    Circle orbit = new Circle(radius, null);
    orbit.setStroke(Color.BLACK);

    Circle point = new Circle(-radius, 0, 7, Color.BLACK);

    AnimationTimer animator = new AnimationTimer() {

        @Override
        public void handle(long now) {
            // UPDATE
            theta += 0.055d;
            if (theta >= 2 * Math.PI) {
                theta = 0;
            }
            double x = radius * Math.cos(theta);
            double y = radius * Math.cos(theta);
            // RENDER
            point.setCenterX(x);
            point.setCenterY(y);
        }
    };
    animator.start();

    group.getChildren().addAll(orbit, point);
    root.getChildren().add(group);
    primaryStage.setScene(scene);
    primaryStage.show();
   }
}

point现在更像钟摆一样运动,如何设置(x,y)使其在轨道上运动?

1 个答案:

答案 0 :(得分:0)

这是使点在轨道上以圆形模式运动的代码,也可以通过将点声明为静态变量来跟踪点的坐标。

public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
    {
        bool valid=SomeMethod();
        if(valid)
             next();
        else
            context.Result = Content("Failed to validate")
    }