JavaFx:每帧更新位置

JavaFx:每帧更新位置,java,javafx,Java,Javafx,我目前正在用JavaFx编写一个棋盘游戏。为此,我有一个类Board,其中包含字段的列表。字段只有一个y和一个x值作为位置。在应用程序的start-方法中,我创建了棋盘游戏的一个对象,该对象在其构造函数中创建了一些字段,并将其添加到列表中。现在,我从boardgame中获取字段列表,迭代它,然后在给定位置上画一个圆 现在我的问题是:如何在运行时更改绘制圆的坐标以移动/设置场动画?有没有办法将我的场对象坐标“链接”到绘制的圆(可能是扩展类,以便直接绘制)或者我必须删除舞台上的所有元素,并使用我的场

我目前正在用JavaFx编写一个棋盘游戏。为此,我有一个类
Board
,其中包含
字段的列表。
字段
只有一个
y
和一个
x
值作为位置。在应用程序的
start
-方法中,我创建了棋盘游戏的一个对象,该对象在其构造函数中创建了一些字段,并将其添加到列表中。现在,我从boardgame中获取字段列表,迭代它,然后在给定位置上画一个圆

现在我的问题是:如何在运行时更改绘制圆的坐标以移动/设置场动画?有没有办法将我的场对象坐标“链接”到绘制的圆(可能是扩展类,以便直接绘制)或者我必须删除舞台上的所有元素,并使用我的场的新位置添加新的圆

该字段稍后可能会更复杂一些(图形、文本、EventListner等),因此解决方案不仅对形状有效

以下是相关代码:

Main.java

public class Main extends Application {

    Stage window;
    int windowWidth = 1000;
    int windowHeight = 1000;

    @Override
    public void start(Stage primaryStage) throws Exception{

        window = primaryStage;

        Group group = new Group();
        group.getChildren().add(button1);

        Scene scene1 = new Scene(group, windowWidth, windowHeight);
        scene1.setFill(Color.rgb(100,100,100, 0.2));

        Board board = new Board();

        for (Field f : board.getFields()) {
            //Make circles out of the fields
            Circle circle = new Circle(calculatePercentageX(f.getXPos()), calculatePercentageY(f.getYPos()), 20, Color.RED);
            group.getChildren().add(circle);
        }

        window.setScene(scene1);
        window.show();
    }


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

    public int calculatePercentageX(int xPx) {
        System.out.println(xPx + " und " + windowWidth + " und " + 100);
        return (int)Math.round(windowWidth/100*xPx);
    }

    public int calculatePercentageY(int yPx) {
        return (int)Math.round(windowHeight/100*yPx);
    }
}
Board.java

public class Board {
    List<Field> fields = new LinkedList<>();

    public Board() {

        //generate fields (id, xPos, yPos)
        fields.add(new Field(0, 10, 10));
        fields.add(new Field(1, 20, 20));
        fields.add(new Field(2, 40, 30));
        fields.add(new Field(3, 40, 60));
        fields.add(new Field(4, 60, 20));
    }

    public List<Field> getFields() {
        return fields;
    }
}
public class Field {
    protected int id = 0;
    protected int xPos = 0;
    protected int yPos = 0;

    public Field(int id, int xPos, int yPos){
        this.id = id;
        this.xPos = xPos;
        this.yPos = yPos;
    }

    public int getXPos(){
        return xPos;
    }

    public int getYPos(){
        return yPos;
    }
}

使用
AnimationTimer
@Jean BaptisteYunès:谢谢你的建议。我将研究它并展示我的结果。现在我的最终解决方案是使用容器的X和Y属性,并将其绑定到我的field对象的X和Y属性。这样,我可以通过更改字段对象的值来控制容器的位置。这使它更容易,因为所有的逻辑都在我的课堂上。