重新定位节点JavaFX
我正在创建一个迷宫游戏,其中将有多个“追击者”跟随一名玩家在迷宫中旋转,为此我需要重新定位追击者,但是我使用.relocate()遇到了一个问题。它只移动它一次,我理解它这样做是因为它移动了整个坐标轴本身,而不仅仅是节点坐标 不幸的是,我无法使用chaser.setCentreX()移动它,因为我将动态创建节点,并且所有节点都具有相同的名称“chaser”,因此我使用getChildren()获取坐标。为了区分多个追踪器,我将使用.setId().getId(),以便访问特定节点的LayoutBounds。例如,如果有三个追踪器,第一个将被称为“追踪器”,Id为1,然后下一个将被称为“追踪器”,Id为2,以此类推 是否有其他方法可以在不出现此问题的情况下重新定位节点,下面的代码演示了这个问题重新定位节点JavaFX,java,javafx,javafx-8,Java,Javafx,Javafx 8,我正在创建一个迷宫游戏,其中将有多个“追击者”跟随一名玩家在迷宫中旋转,为此我需要重新定位追击者,但是我使用.relocate()遇到了一个问题。它只移动它一次,我理解它这样做是因为它移动了整个坐标轴本身,而不仅仅是节点坐标 不幸的是,我无法使用chaser.setCentreX()移动它,因为我将动态创建节点,并且所有节点都具有相同的名称“chaser”,因此我使用getChildren()获取坐标。为了区分多个追踪器,我将使用.setId().getId(),以便访问特定节点的LayoutB
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());