如何处理Java Applet中的多个按键?

我正在教自己,从在线教程,如何用Java编写游戏。 我正在使用Java Applets创建一个Pong游戏。 每个桨叶由不同的钥匙控制,用于1v1比赛。 如果两个用户在不同时间点击键,这可以正常工作。 但是当按下一个键然后按下另一个键时(例如:按住箭头键,然后用户2按住’S’键),第二个键将覆盖第一个键,第一个键盘将停止移动。 我猜我需要使用线程,但我不太了解它们,我无法理解如何使用/实现它们。 当两个(或更多)键被按下时,我将如何处理这个案子?

奖金:就像我说的我对线程知之甚少 – 我假设我还需要一个球/冰球移动而其他一切都在继续。 是正确的,如果是这样,我怎么把线程放在没有输入的东西上?

谢谢你的帮助,DJ

你通常做的是记住每个按键的状态。

您保留一系列动作(或者如果您需要,还可以保存所有键的数组)。 keyDown事件导致例如

boolean actions[12];... ... public boolean keyDown( Event e, int key ) { if (key == 'a') { actions[ACTION_LEFT] = true; } .. } 

并且您需要捕获keyup事件并在释放键时将操作设置为false。

在移动逻辑中,您只需检查按键的状态即可

 if(actions[ACTION_LEFT] == true) moveLeft(); if(actions[ACTION_RIGTH] == true) moveRight(); 

通常使用称为游戏循环(google it)的东西代替线程。

http://en.wikipedia.org/wiki/Game_programming

基本的想法是

  Loop Get all inputs Get game clock Update state based on clock and inputs Update Display Limit frame rate if you need to 

无论如何 – 而不是获得键盘事件 – 你在某些点检查键盘的状态。 这段代码似乎是为Java做的

http://www.gamedev.net/reference/articles/article2439.asp

它使用事件来设置您在循环中查看的变量。

以防万一有人想看看我是如何回答这个问题的。 我的keyDown()和keyUp()方法如下:

 public boolean keyDown(Event e, int key) { message = key + "pressed"; //right paddle if(key == 1005) { rpaddle_up = true; } if(key == 1004) { rpaddle_down = true; } //left paddle if(key == 115) { lpaddle_up= true; } if(key == 119) { lpaddle_down=true; } //x key = exit if(key == 'x') System.exit(0); return true; } public boolean keyUp(Event e, int key) { //right paddle if(key == 1005) { rpaddle_up = false; } if(key == 1004) { rpaddle_down = false; } //left paddle if(key == 115) { lpaddle_up= false; } if(key == 119) { lpaddle_down=false; } return true; } 

希望如果有人有同样的问题,这将有助于他们。 并感谢大家的投入和帮助。

如果我没弄错的话,你可以使用Applet处理keyUp()和keyDown()方法。 你有没有尝试在keyDown上设置一个标志,然后在keyUp上取消设置? 例如:

  public boolean keyDown( Event e, int key ) { if (key == 'a') { player1.go("left") } } public boolean keyUp( Event e, int key ) { if (key == 'a') { player1.stop("left") } } 

只是一个想法。 我确信有一种标准的方法可以解决这个问题。

您可以使用Swing Timer定期在keydown / keyup事件之间触发移动事件。