我正在JavaFX上做一个非常简单的游戏。我有两个对象来代表玩家:
现在,我实现了玩家移动的基本功能,如goUp、goLeft等,这些都改变了player类中的属性X和Y(这些是DoubleProperty类型)。现在我想让玩家的X和Y属性的每一个变化都反映在playerObj中,所以我使用了属性绑定,如下所示:
playerObj.yProperty().bind(player.yProperty());但是,当我调用goUp()方法时,player对象中的"y属性“将更改,而playerObj对象中的"y属性”不会更改。所以:
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属性绑定到player Y属性时,它的Y属性也没有改变?
编辑:完整代码(删除不相关部分)
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);
}
}发布于 2015-07-07 11:39:19
您的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(...)也是如此。
https://stackoverflow.com/questions/31266805
复制相似问题