重新定位节点 JavaFX



我正在创建一个迷宫游戏,其中将有多个"追逐者"跟随玩家绕过迷宫,为此我需要重新定位追逐者,但是我遇到了使用 .relocate(( 的问题,它只移动一次,我知道它这样做是因为它移动了整个坐标轴本身而不仅仅是节点坐标。

不幸的是,我无法使用chaser.setCentreX((来移动它,因为我将动态创建节点并且都具有相同的名称"chaser",因此为什么我使用getChildren((来获取坐标。为了区分多个追逐者,我将使用 .setId(( .getId((,以便我可以访问特定节点的 LayoutBounds。例如,如果有三个追逐者,第一个将被称为"追逐者",Id 为 1,然后下一个称为 Id 为 2,依此类推。

有没有另一种方法可以在没有此问题的情况下重新定位节点? ,下面的代码演示了这个问题。

package sample;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception{
Pane pane=new Pane();
primaryStage.setTitle("Hello World");
primaryStage.setScene(new Scene(pane, 600, 600));
primaryStage.show();
Circle chaser=new Circle();
chaser.setRadius(12);
chaser.setCenterX(100);
chaser.setCenterY(50);
chaser.setFill(Color.YELLOW);
pane.getChildren().add(chaser);
Timeline timeline = new Timeline(new KeyFrame(Duration.millis(30), new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) { 
System.out.println("running");
pane.getChildren().get(0).relocate(chaser.getCenterX()+400,chaser.getCenterY());

}
}));
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.play();
}

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

relocate所做的是分配layoutXlayoutY属性。这些完全独立于centerXcenterY。由于后一个属性永远不会更新,因此无论您在chaser上执行relocate(chaser.getCenterX()+400,chaser.getCenterY());的频率如何,目标位置都保持不变。

要查看更新,您需要参考更新位置时更新的值,例如

chaser.relocate(chaser.getLayoutX() + 400, chaser.getLayoutY());

chaser.setCenterX(chaser.getCenterX() + 400);
// chaser.setCenterY(chaser.getCenterY());

chaser.setTranslateX(chaser.getTranslateX() + 400);
// chaser.setTranslateY(chaser.getTranslateY());

至于使用ids:这似乎完全没有必要。您可以在不使用 CSS id 的情况下跟踪追逐者,只需将它们存储在合适的数据结构中即可。如果这些是父级唯一的子项,您甚至不需要额外的数据结构,因为在这种情况下,每个追逐者都将存储在子项列表中......

最新更新