java - 重新定位节点 JavaFX

标签 java javafx javafx-8

我正在创建一个迷宫游戏,其中会有多个“追逐者”跟随玩家绕过迷宫,为此,我需要重新定位追逐者,但是我使用 .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 。由于后面的属性永远不会更新,因此无论您执行 relocate(chaser.getCenterX()+400,chaser.getCenterY()); 的频率如何,目标位置都保持不变。上chaser .

要查看更新,您需要引用更新位置时更新的值,例如

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 的情况下跟踪追踪者,只需将它们存储在合适的数据结构中即可。如果这些是父级的唯一子级,您甚至不需要额外的数据结构,因为在这种情况下每个追逐者都将存储在子级列表中......

关于java - 重新定位节点 JavaFX,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58356319/

相关文章:

java - JAXB 解码架构问题 : 'org.xml.sax.SAXParseException cvc-elt.1'

java - 安卓工作室 : java. lang.OutOfMemoryError

java - 我生成毕达哥拉斯三胞胎的代码出了什么问题?

java - 关于java中的双键并发hashmap

Java:通过应用程序类打开游戏时不会触发 keyPressed 事件

java - 如何知道 JavaFX 中的插入符坐标(而不是位置)?

java - 数据分配 JavaFX 后无法从 TableView 检索所有行

multithreading - 如何避免不在 FX 应用程序线程上; currentThread = JavaFX 应用程序线程错误?

javafx - javaFx 应用程序中的 Bootstrap 样式?

java - 无法使用Java打开新窗口(基于FXML)