Я работаю над очень простой игрой в JavaFX. У меня есть два объекта для представления игрока:Binding property dont work
игрока - экземпляр класса игрока
playerObj - экземпляр класса Rectangle, используемый для representating игрока на карте
Теперь я реализовал основные функции для движения игроков, такие как goUp, goLeft и т. д. Все они изменяют свойства X и Y в классе игроков (это тип DoubleProperty). Теперь я хочу сделать так, каждое изменение X игрока и Y свойства будет отражать в playerObj поэтому я использовал связывание, как это свойство:
playerObj.yProperty().bind(player.yProperty());
Но когда я вызываю метод GoUp(), «Y свойство» в объект игрока изменится, но свойство «y» в объекте playerObj не изменится. Итак:
pane.setOnKeyPressed(e -> {
switch(e.getCode()) {
case UP:
player.goUp();
System.out.println("player Y property: "+player.yProperty().getValue());
System.out.println("playerObj Y property: "+playerObj.yProperty().getValue());
break;
}
});
Будет ли результат в этом (после вызова метода GoUp() 3 раза):
player Y property: 245.0
playerObj Y property: 250.0
player Y property: 240.0
playerObj Y property: 250.0
player Y property: 235.0
playerObj Y property: 250.0
Почему не playerObj Y изменить свойство тоже, когда я переплетен с его игроком Y собственностью?
EDIT: Полный код (удален несущественные части)
Player.java
public class Player {
private DoubleProperty x;
private DoubleProperty y;
private Scene scene;
public Player(Scene scene) {
this(DEFAULT_NAME, DEFAULT_COLOR, scene);
}
public Player(String name, Color color, Scene scene) {
this.name = new SimpleStringProperty(name);
this.color = color;
this.scene = scene;
}
public Rectangle drawPlayer() {
Rectangle player = new Rectangle(getX(),getY(),SIZE_OF_PLAYER,SIZE_OF_PLAYER);
player.setFill(color);
return player;
}
public Player goUp() {
if(getY() != 0 && getY() != scene.getHeight()) {
setY(yProperty().subtract(5).getValue());
}
}
public DoubleProperty xProperty() {
return x;
}
public DoubleProperty yProperty() {
return y;
}
public double getX() {
return x.getValue();
}
public void setX(double x) {
this.x = new SimpleDoubleProperty(x);
}
public double getY() {
return y.getValue();
}
public void setY(double y) {
this.y = new SimpleDoubleProperty(y);
}
}
Game.java
public class Game extends Application {
private Scene scene;
private Player player;
private Rectangle playerObj;
private Pane pane;
@Override
public void start(Stage primaryStage) {
pane = new Pane();
scene = new Scene(pane,500,500);
player = new Player(scene);
player.setX(scene.getWidth()/2);
player.setY(scene.getHeight()/2);
playerObj = player.drawPlayer();
pane.getChildren().add(playerObj);
playerObj.yProperty().bind(player.yProperty());
pane.setOnKeyPressed(e -> {
switch(e.getCode()) {
case LEFT:
player.goLeft();
break;
case UP:
player.goUp();
System.out.println("player Y property: "+player.yProperty().getValue());
System.out.println("playerObj Y property: "+playerObj.yProperty().getValue());
break;
case RIGHT:
player.goRight();
break;
case DOWN:
player.goDown();
}
});
pane.requestFocus();
primaryStage.setScene(scene);
primaryStage.setTitle("Game");
primaryStage.setResizable(false);
primaryStage.show();
}
public static void main(String[] args) {
Application.launch(args);
}
}
Весь код, который вы опубликовали, выглядит правильно и должен вести себя так, как вы хотите; поэтому, вероятно, в вашем коде есть ошибки, которые мешают ему работать. Можете ли вы создать [простой, полный пример] (http://stackoverflow.com/help/mcve) и отредактировать свой вопрос, чтобы включить его? –
См. Также: [Как написать KeyListener для JavaFX] (http://stackoverflow.com/questions/29962395/how-to-write-a-keylistener-for-javafx). – jewelsea
@James_D Я расширил OP с полным кодом (удалены только те части, которые не имеют к этому никакого отношения). – user3560463