如何在 Java 中更快地自动按下按键?
How can I make a key get autopressed faster in Java?
我正在尝试制作乒乓球游戏,但动作很笨重;每当我按住一个键使桨移动时,都会有轻微的延迟。
比如我按住一个键,桨会移动一次,过一秒后又开始连续移动。
有人告诉我这是 OS 的功能,而不是 Java 的功能;但是,我仍然想在 Java 中找到一个解决方法,以便从一开始就可以平滑连续地移动,而不必等待 OS 开始自动按键。
有人可以帮忙吗? (我已经尝试过布尔值和密钥监听器以及 "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 class。
此外,我认为您的 while 循环中没有必要使用 while 循环,而是坚持使用 if 语句:
while (true) {
sim.evolve(1.0);
if (! paddle1Up){
sim.movePaddle(sim.getPaddle1(), 0, -1);
}
也不确定是否有意,请注意 if 语句(您的 while 循环)中的 !。
类似的案例我见过无数。我也经历过一次,虽然我不确定原因。现在很难说没有看到更多你的代码,但我强烈推荐 implements
keylistener
并使用那里的方法,与你的代码非常相似,它应该可以毫无问题地工作。
您可能已经读过这篇文章 post or this post,如果没有,也许它会对您有所帮助。
希望对你有用。
我正在尝试制作乒乓球游戏,但动作很笨重;每当我按住一个键使桨移动时,都会有轻微的延迟。
比如我按住一个键,桨会移动一次,过一秒后又开始连续移动。
有人告诉我这是 OS 的功能,而不是 Java 的功能;但是,我仍然想在 Java 中找到一个解决方法,以便从一开始就可以平滑连续地移动,而不必等待 OS 开始自动按键。
有人可以帮忙吗? (我已经尝试过布尔值和密钥监听器以及 "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 class。
此外,我认为您的 while 循环中没有必要使用 while 循环,而是坚持使用 if 语句:
while (true) {
sim.evolve(1.0);
if (! paddle1Up){
sim.movePaddle(sim.getPaddle1(), 0, -1);
}
也不确定是否有意,请注意 if 语句(您的 while 循环)中的 !。
类似的案例我见过无数。我也经历过一次,虽然我不确定原因。现在很难说没有看到更多你的代码,但我强烈推荐 implements
keylistener
并使用那里的方法,与你的代码非常相似,它应该可以毫无问题地工作。
您可能已经读过这篇文章 post or this post,如果没有,也许它会对您有所帮助。
希望对你有用。