我正在尝试打乒乓球,但是动作很笨拙。每当我按住某个键以使桨移动时,都会有一点延迟。
例如,我将按住一个键,桨将移动一次,然后需要一秒钟,才开始连续不断地移动。
有人告诉我这是操作系统的功能,而不是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();
}
最佳答案
很确定你需要写
case KeyEvent.VK_UP:
当然,除非扩展KeyEvent类。
我也不认为在while循环中有一个while循环是必要的,而是坚持使用if语句:
while (true) {
sim.evolve(1.0);
if (! paddle1Up){
sim.movePaddle(sim.getPaddle1(), 0, -1);
}
不确定是否有意,请注意!在if语句中(您的while循环)。
我以前曾见过许多类似的案例。我也曾经经历过,尽管我不确定原因。现在很难说没有看到更多代码,但是我强烈建议
implements
keylistener
并使用那里的方法,与您的代码非常相似,希望它可以正常工作。您可能已经阅读了这个post或这个post,如果没有的话可能会有所帮助。
希望可以帮助你。