在 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();
这仍然是异步运行的,但没有多线程。
请原谅我对问题的糟糕命名,我想不出更好的名字。我尝试制作简单的游戏,其中我有 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();
这仍然是异步运行的,但没有多线程。