重定位节点 JavaFX

Relocating a node JavaFX

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

不幸的是,我不能使用 chaser.setCentreX() 来移动它,因为我将动态创建节点并且所有节点都具有相同的名称 'chaser' 因此我使用 getChildren() 来获取坐标。为了区分多个追踪器,我将使用 .setId() .getId() 以便我可以访问特定节点的 LayoutBounds。例如,如果有三个追赶者,第一个将被称为 'chaser',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());

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