我正在尝试打乒乓球,但是动作很笨拙。每当我按住某个键以使桨移动时,都会有一点延迟。

例如,我将按住一个键,桨将移动一次,然后需要一秒钟,才开始连续不断地移动。

有人告诉我这是操作系统的功能,而不是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,如果没有的话可能会有所帮助。

希望可以帮助你。

07-24 09:39
查看更多