【问题标题】:JavaFX smooth movement and timelinesJavaFX 流畅的移动和时间线
【发布时间】:2018-05-19 06:31:17
【问题描述】:

我最近开始使用 JavaFX,并且正在制作一个由 WASD 键控制的玩家的小游戏。起初我这样做是为了让你可以通过在 keyPress 上调整他的 x 和 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() 并在释放 W 时将获得 timelineW.stop();其他键也是如此。我进行此更改的总体原因是因为运动更加流畅,但仍然存在一些错误。甚至可以用这个做运动吗?或者我应该寻找替代方案。

感谢正手。

【问题讨论】:

    标签: java animation timeline smoothing


    【解决方案1】:

    通常,您需要定期检查按键并重置移动时间线:

    /** 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();
        }
    
        // ...
    }
    

    请注意,循环计数保留为默认值,即一。

    【讨论】:

      猜你喜欢
      • 2014-09-25
      • 1970-01-01
      • 2012-04-16
      • 2020-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多