如何在 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,如果没有,也许它会对您有所帮助。

希望对你有用。