Javafx平滑运动和时间表



我最近开始使用javafx,我正在制作一个小游戏,玩家由WASD键控制。起初,我做到了,这样您就可以通过调整X&amp来移动玩家。Y在键盘上进行坐标,但我发现运动非常粗糙。现在我改变了事情,开始使用时间表启动&按下钥匙并释放键时阻止它们。

代码:

Timeline timelineW = new Timeline();
Timeline timelineA = new Timeline();
Timeline timelineS = new Timeline();
Timeline timelineD = new Timeline();
 public void createTimeLineW() {
    timelineW.setCycleCount(Timeline.INDEFINITE);
    final KeyValue kv = new KeyValue(player.yProperty(), -Integer.MAX_VALUE);
    final KeyFrame kf = new KeyFrame(Duration.hours(3000), kv);
    timelineW.getKeyFrames().add(kf);
}
public void createTimeLineA() {
    timelineA.setCycleCount(Timeline.INDEFINITE);
    final KeyValue kv = new KeyValue(player.xProperty(), -Integer.MAX_VALUE);
    final KeyFrame kf = new KeyFrame(Duration.hours(3000), kv);
    timelineA.getKeyFrames().add(kf);
}
public void createTimeLineS() {
    timelineS.setCycleCount(Timeline.INDEFINITE);
    final KeyValue kv = new KeyValue(player.yProperty(), Integer.MAX_VALUE);
    final KeyFrame kf = new KeyFrame(Duration.hours(3000), kv);
    timelineS.getKeyFrames().add(kf);
}
public void createTimeLineD() {
    timelineD.setCycleCount(Timeline.INDEFINITE);
    final KeyValue kv = new KeyValue(player.xProperty(), Integer.MAX_VALUE);
    final KeyFrame kf = new KeyFrame(Duration.hours(3000), kv);
    timelineD.getKeyFrames().add(kf);
}

这是当前运动的基础。因此,按下w时,ImageView播放器将获得timelinew.play(),并且发布后,它将获得timelinew.stop();就像其他钥匙一样。我进行此更改的总体原因是因为运动更加平稳,但是仍然有几个错误。甚至可以这样做吗?还是我应该研究替代方案。

感谢正手。

通常,您需要定期检查键并重置运动时间表:

/** Distance player moves in one "step." */
private static final int movementDistance = 10;
/** Time it takes to move one "step." */
private static final Duration movementTime = Duration.seconds(0.5);
private Timeline xMovement;
private void checkMovementKeys() {
    // ...
    if (xMovement == null) {
        xMovement = new Timeline();
    }
    if (rightMovementKeyPressed) {
        xMovement.getKeyFrames().setAll(
            new KeyFrame(movementTime,
                new KeyValue(player.xProperty(),
                    player.getX() + movementDistance)));
        xMovement.playFromStart();
    }
    if (leftMovementKeyPressed) {
        xMovement.getKeyFrames().setAll(
            new KeyFrame(movementTime,
                new KeyValue(player.xProperty(),
                    player.getX() - movementDistance)));
        xMovement.playFromStart();
    }
    // ...
}

请注意,周期计数默认为一个。

最新更新