Перемещение узла JavaFX - PullRequest
       16

Перемещение узла JavaFX

0 голосов
/ 12 октября 2019

Я создаю игру-лабиринт, в которой будет несколько «преследователей», следующих за игроком вокруг лабиринта, для этого мне нужно переместить охотников, однако я столкнулся с проблемой, используя .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);
}
}

1 Ответ

2 голосов
/ 12 октября 2019

Что делает relocate, так это присваивает свойства layoutX и layoutY. Они полностью независимы от centerX и centerY. Поскольку последние свойства никогда не обновляются, целевое местоположение остается постоянным независимо от того, как часто вы выполняете 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());

Что касается использования идентификаторов: это кажется совершенно ненужным. Вы можете отслеживать преследователи, не используя идентификатор CSS, просто сохраняя их в подходящей структуре данных. Если это единственные дочерние элементы родителя, вам даже не нужна дополнительная структура данных, поскольку в этом случае каждый преследователь будет сохранен в списке дочерних элементов ...

...