在 class 中设置字段持续时间

Setting duration of field in class

请原谅我对问题的糟糕命名,我想不出更好的名字。我尝试制作简单的游戏,其中我有 PlayerModel 和一些统计数据,例如 movementspeed

public class PlayerModel{
    private Integer movSpeed;
    //constructor here, omitted
    ...
    public void setmovSpeed(int ms){this.movSpeed = ms}
    ...
}

在我的示例中,我正在尝试弄清楚当玩家获得增加移动速度的 buff 并且我想设置 buff 的持续时间时如何处理这种情况。

我不确定这是否是个好主意,但我想在激活 buff 时通过我的 PlayerControler class 中的 setter 设置移动。

public class PlayerController implements EventHandler<KeyEvent>{
    private PlayerModel playerModel;
    //constructor here, omitted
    @Override
    public void handle(KeyEvent event) {
        if (event.getCode() == KeyCode.SPACE) {
            //movement speed buff activated here
            playerModel.setmovSpeed(playerModel.getmovSpeed()*2);
            }
    ...
}

然后在我的游戏循环中我有这个:

public void start(Stage theStage){
    ...
     scene.setOnKeyPressed((EventHandler) player.playerController);
     theStage.setScene(scene);
     theStage.show();
     AnimationTimer timer = new AnimationTimer() {
         ...
     }
     timer.start();
}

我不知道应该如何实现移动速度持续时间。持续时间结束后,移动速度将重新开始。

运行 在单独的线程中休眠,然后重置移动速度。例如:

        CompletableFuture.runAsync(() -> {
            try {
                Thread.sleep(Duration.ofSeconds(5).toMillis());
                playerModel.setmovSpeed(playerModel.DEFAULT_MOVE_SPEED);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        });

编辑

如评论中所述,上面的多线程需要同步,更简单的解决方案是使用 PauseTransition。例如:

        PauseTransition moveSpeedReset = new PauseTransition(Duration.seconds(5));
        moveSpeedReset.setOnFinished(e -> playerModel.setmovSpeed(playerModel.DEFAULT_MOVE_SPEED));
        moveSpeedReset.play();

这仍然是异步运行的,但没有多线程。