重新定位节点JavaFX

重新定位节点JavaFX,java,javafx,javafx-8,Java,Javafx,Javafx 8,我正在创建一个迷宫游戏,其中将有多个“追击者”跟随一名玩家在迷宫中旋转,为此我需要重新定位追击者,但是我使用.relocate()遇到了一个问题。它只移动它一次,我理解它这样做是因为它移动了整个坐标轴本身,而不仅仅是节点坐标 不幸的是,我无法使用chaser.setCentreX()移动它,因为我将动态创建节点,并且所有节点都具有相同的名称“chaser”,因此我使用getChildren()获取坐标。为了区分多个追踪器,我将使用.setId().getId(),以便访问特定节点的LayoutB

我正在创建一个迷宫游戏,其中将有多个“追击者”跟随一名玩家在迷宫中旋转,为此我需要重新定位追击者,但是我使用.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);
}
}
包装样品;
导入javafx.animation.KeyFrame;
导入javafx.animation.Timeline;
导入javafx.application.application;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.scene;
导入javafx.scene.layout.Pane;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Circle;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类主扩展应用程序{
@凌驾
public void start(Stage primaryStage)引发异常{
窗格=新窗格();
setTitle(“你好世界”);
初始阶段。设置场景(新场景(窗格,600600));
primaryStage.show();
圆追逐器=新圆();
追逐器设定半径(12);
追逐器。setCenterX(100);
赛森特里(50);
追逐者。设置填充(颜色。黄色);
pane.getChildren().add(chaser);
Timeline Timeline=新的时间线(新的关键帧(Duration.millis(30),新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
System.out.println(“运行”);
pane.getChildren().get(0).重新定位(chaser.getCenterX()+400,chaser.getCenterY());
}
}));
timeline.setCycleCount(timeline.unfinite);
timeline.play();
}
公共静态void main(字符串[]args){
发射(args);
}
}

重新定位所做的是分配
layoutX
layoutY
属性。它们完全独立于
centerX
centerY
。由于后一个属性从未更新,因此无论执行
重定位的频率如何(chaser.getCenterX()+400,chaser.getCenterY()),目标位置都保持不变
追逐器

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

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



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

重新定位所做的是分配
layoutX
layoutY
属性。它们完全独立于
centerX
centerY
。由于后一个属性从未更新,因此无论执行
重定位的频率如何(chaser.getCenterX()+400,chaser.getCenterY()),目标位置都保持不变
追逐器

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

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



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

。setTranslate也不起作用。setTranslate也不起作用。请注意,追踪器几乎会立即消失,由于您每30毫秒移动一次400像素的节点。您好,谢谢您的回复,我尝试了您的第三个代码示例,它可以工作,移动圆。但是,当我尝试获取新的中心坐标时,它不会改变吗?尽管它在移动,我还是尝试实现了第二个示例,并使用了您的想法,即使用数据结构来存储追踪器,这非常有效。谢谢你的帮助!渲染圆的位置由所有这些属性的组合确定。更新其他属性之一不会影响其他属性。如果使用多个,则在确定渲染圆的位置时,需要考虑所有已修改的。请注意,追逐器将立即消失,因为每30毫秒移动节点400 px。您好,感谢您的回复,我尝试了您的第三个代码示例,效果良好,移动圆。但是,当我尝试获取新的中心坐标时,它不会改变吗?尽管它在移动,我还是尝试实现了第二个示例,并使用了您的想法,即使用数据结构来存储追踪器,这非常有效。谢谢你的帮助!渲染圆的位置由所有这些属性的组合确定。更新其他属性之一不会影响其他属性。如果使用其中的多个,则在确定渲染圆的位置时,需要考虑所有修改的对象。
chaser.setTranslateX(chaser.getTranslateX() + 400);
// chaser.setTranslateY(chaser.getTranslateY());