如何使密钥在Java中更快地自动进行?

时间:2016-11-09 17:29:29

标签: java keyboard keyevent

我试图打乒乓球比赛,但运动很笨拙;每当我按住一个键以使桨移动时,会有轻微的延迟。

例如,我按住一个键,拨片将移动一次,然后在它开始连续再次移动之前需要一秒钟。

我告诉过这是操作系统的一个功能,而不是Java;但是,我仍然希望在Java中找到一种解决方法,以便从一开始就能顺利和连续地进行移动,而无需等待操作系统开始自动按键。

有人可以帮忙吗? (我已经尝试过布尔和键盘乐队"而#34;循环,但这些对我来说不起作用。从这些失败的尝试之一中获取的段落写在下面:)

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();
}

1 个答案:

答案 0 :(得分:1)

很确定你需要写

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,如果不是,它可能会有所帮助。

希望它适合你。