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