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

时间:2009-07-15 19:15:02

标签: java multithreading

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

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

谢谢你的帮助, DJ

5 个答案:

答案 0 :(得分:3)

游戏通常使用称为游戏循环(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

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

答案 1 :(得分:3)

您通常要记住每次按键的状态。

您保留一系列动作(如果您需要,还可以保留所有按键的数组)。 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();

答案 2 :(得分:1)

以防万一有人想看看我是怎么回答这个问题的。我的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;
    }

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

答案 3 :(得分:0)

如果我没弄错的话,你可以使用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")
      }
   }

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

答案 4 :(得分:0)

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