2016-11-09 43 views
0

我试图做一个乒乓球游戏,但运动是笨重的;每当我按下一个键使桨移动时,就会有轻微的延迟。如何让密钥在Java中更快地自动按下?

例如,我将握住一把钥匙,桨板将移动一次,然后在它开始继续移动之前需要一秒。

我被告知这是OS的功能,而不是Java的功能;不过,我仍然希望在Java中找到一种解决方法,以便从一开始就可以保持平稳和持续的运行,而无需等待操作系统开始自动按压密钥。

有人可以帮忙吗? (我试过布尔和keylisteners和“而”循环,但这些并没有为我工作。从这些失败的尝试中获取的通道下面写:)

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

您可以考虑不重置keyup事件的值。现在这将导致极端的移动到底部。为了避免这种情况,请计算自上次调用while循环以来的时间差,并将其与希望使用的速度相乘。 – Gildraths

+0

谢谢,但你能解释一下如何计算这个时间差吗?我不确定我看到这里是什么意思。 – Asker

+1

只需保存最后一个循环的System.currentTimeMillis()并从当前循环中减去它。有了这个,你有自上一次循环以来的毫秒。现在,您可以简单地计算出“酒吧”应该随着您的速度移动多远。基本上timedifference/1000 *(speedInCMperSec) – Gildraths

回答

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循环)。

我以前见过很多类似的案例。我也经历过一次,但我不确定原因。现在很难说没有看到更多的代码,但我强烈建议implementskeylistener并使用那里的方法,非常类似于您的代码,它应该有希望工作没有问题。 您可能已经阅读了此post或此post,如果不是这可能会有所帮助。

希望它适合你。

+0

是的,“!”在if语句中是一个错字。现在修复它。谢谢您的帮助!稍后再看看。 – Asker