【问题标题】:How do I handle multiple key presses in a Java Applet?如何在 Java Applet 中处理多个按键?
【发布时间】:2009-07-23 02:04:35
【问题描述】:

我正在通过在线教程自学如何用 Java 编写游戏。我正在使用 Java Applets 来创建 Pong 游戏。每个桨都由不同的按键控制,以进行 1v1 比赛。如果两个用户在不同的时间敲击键,这很好用。但是当一个键被按住然后另一个键被按住时(例如:按住箭头键,然后用户 2 按住“S”键),第二个键会覆盖第一个键,第一个键将停止移动。我猜我需要使用线程,但我对它们了解不多,而且我无法理解如何使用/实现它们。当两个(或更多)键被按住时,我将如何处理这种情况?

奖励:就像我说的那样,我对线程知之甚少 - 我假设我还需要一个来让球/冰球在其他一切都在进行时移动。是正确的,如果是这样,我如何在不需要输入的东西上添加线程?

感谢您的帮助, DJ

【问题讨论】:

    标签: java multithreading


    【解决方案1】:

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

    你保留一个你的动作数组(或者如果你也想要一个所有键的数组)。 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();
    

    【讨论】:

    • 将此与 Lou Franco 关于游戏循环的回答结合起来。检查按键状态将在该循环内。
    【解决方案2】:

    游戏通常不使用线程,而是使用称为游戏循环的东西(谷歌搜索)。

    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

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

    【讨论】:

    • 感谢您的意见。我以前从未听说过“游戏循环”。第二个链接有很棒的东西。再次感谢!
    • 这个答案加上“否”让我省了很多麻烦和时间。谢谢!!!
    【解决方案3】:

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

    希望如果有人遇到同样的问题,这将对他们有所帮助。感谢大家的意见和帮助。

    【讨论】:

      【解决方案4】:

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

      只是一个想法。我确信有一个标准的方法来处理这个问题。

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-19
          • 2021-07-08
          • 2013-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多