2015-07-07 3 views
0

Я работаю над очень простой игрой в JavaFX. У меня есть два объекта для представления игрока:Binding property dont work

  1. игрока - экземпляр класса игрока

  2. 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); 
    } 
} 
+0

Весь код, который вы опубликовали, выглядит правильно и должен вести себя так, как вы хотите; поэтому, вероятно, в вашем коде есть ошибки, которые мешают ему работать. Можете ли вы создать [простой, полный пример] (http://stackoverflow.com/help/mcve) и отредактировать свой вопрос, чтобы включить его? –

+0

См. Также: [Как написать KeyListener для JavaFX] (http://stackoverflow.com/questions/29962395/how-to-write-a-keylistener-for-javafx). – jewelsea

+0

@James_D Я расширил OP с полным кодом (удалены только те части, которые не имеют к этому никакого отношения). – user3560463

ответ

2

Ваши x и y свойства в Player класса неправильно реализованы.

При вызове player.setY(...) вы создаете новый DoubleProperty:

public void setY(double y) { 
    this.y = new SimpleDoubleProperty(y); 
} 

и, конечно, это не свойство, к которому ваш узел был ранее связан. Таким образом, это значение не отражается в узле.

Вам нужно

public void setY(double y) { 
    this.y.set(y); 
} 

и аналогично для setX(...).