【发布时间】:2017-03-23 14:31:44
【问题描述】:
我正在尝试制作乒乓球游戏,但动作很笨拙;每当我按住一个键进行桨移动时,都会有一点延迟。
例如,我按住一个键,桨会移动一次,然后需要一秒钟才能再次开始连续移动。
有人告诉我这是操作系统的特性,而不是 Java 的特性;但是,我仍然想在 Java 中找到一种解决方法,以便从一开始就平滑且连续地移动,而不必等待操作系统开始自动按键。
有人可以帮忙吗? (我尝试过布尔值和键侦听器以及“while”循环,但这些对我不起作用。从这些失败的尝试中摘录的一段写在下面:)
root.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
switch (event.getCode()) {
case UP: paddle1Up = true;
break;
case DOWN: paddle1Down = true;
break;
case W: paddle2Up = true;
break;
case S: paddle2Down = true;
break;
}
}
});
root.setOnKeyReleased(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent event) {
switch (event.getCode()) {
case UP: paddle1Up = false;
break;
case DOWN: paddle1Down = false;
break;
case W: paddle2Up = false;
break;
case S: paddle2Down = false;
break;
}
}
});
root.requestFocus();
primaryStage.setTitle("Pong");
primaryStage.setScene(scene);
primaryStage.setOnCloseRequest((event)->System.exit(0));
primaryStage.show();
// This is the main animation thread
new Thread(() -> {
while (true) {
sim.evolve(1.0);
while (paddle1Up){
sim.movePaddle(sim.getPaddle1(), 0, -1);
}
while (paddle1Down){
sim.movePaddle(sim.getPaddle1(), 0, 1);
}
while (paddle2Up){
sim.movePaddle(sim.getPaddle2(), 0, -1);
}
while (paddle2Down){
sim.movePaddle(sim.getPaddle2(), 0, 1);
}
Platform.runLater(()->sim.updateShapes());
try {
Thread.sleep(25);
} catch (InterruptedException ex) {
}
}
}).start();
}
【问题讨论】:
-
您可以考虑不重置 keyup 事件的值。现在这将导致极快地移动到底部。为了避免这种情况,请计算自上次调用 while 循环以来的时间差,并将其与您希望使用的速度相乘。
-
谢谢,但您能否解释一下如何计算这个时差?我不确定我明白这里的意思。
-
只需保存最后一个循环的 System.currentTimeMillis() 并从当前循环中减去它。有了这个,你就有了自上次循环以来的毫秒数。现在您可以简单地计算“条”应随您的速度移动多远。基本上时差/1000*(speedInCMperSec)
-
啊,我明白了。谢谢!但是,另一个问题:回到原来的评论,建议是不要重置 keyup 事件的值。这样做的目的是什么?这不是意味着桨不可能保持静止吗?
-
啊,是的,这是真的,如果你在 keyup 事件中将速度设置为零会更好。然后它应该像预期的那样工作