我试图做一个乒乓球游戏,但运动是笨重的;每当我按下一个键使桨移动时,就会有轻微的延迟。如何让密钥在Java中更快地自动按下?
例如,我将握住一把钥匙,桨板将移动一次,然后在它开始继续移动之前需要一秒。
我被告知这是OS的功能,而不是Java的功能;不过,我仍然希望在Java中找到一种解决方法,以便从一开始就可以保持平稳和持续的运行,而无需等待操作系统开始自动按压密钥。
有人可以帮忙吗? (我试过布尔和keylisteners和“而”循环,但这些并没有为我工作。从这些失败的尝试中获取的通道下面写:)
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循环以来的时间差,并将其与希望使用的速度相乘。 – Gildraths
谢谢,但你能解释一下如何计算这个时间差吗?我不确定我看到这里是什么意思。 – Asker
只需保存最后一个循环的System.currentTimeMillis()并从当前循环中减去它。有了这个,你有自上一次循环以来的毫秒。现在,您可以简单地计算出“酒吧”应该随着您的速度移动多远。基本上timedifference/1000 *(speedInCMperSec) – Gildraths