java - java中同时按下两个键

标签 java swing

我正在开发一个简单的 2D 游戏,其中包含两个玩家。我用 W、A、S 和 D 键移动玩家 1。其他玩家由箭头键控制。

我面临的问题是,当按住任何箭头键移动玩家 2 时,W、S、D 和 A 键对玩家 1 有效,反之亦然。

我看到过一些答案,例如 this ,但这并没有解决我的问题。

我有一个主类 Gameplay 并制作了两个内部类 Player1Listener 和 Player2Listener (实现 KeyListener)。

下面显示了一个类的示例代码,其他子类看起来相同。

private class Player1Listener implements KeyListener
{
    public void keyTyped(KeyEvent e) {}
    public void keyReleased(KeyEvent e) {}      
    public void keyPressed(KeyEvent e) {    
        if(e.getKeyCode()== KeyEvent.VK_W)
        {
            player1right = false;
            player1left = false;
            player1down = false;
            player1up = true;       

            player1Y-=10;

        }
        if(e.getKeyCode()== KeyEvent.VK_A)
        {
            player1right = false;
            player1left = true;
            player1down = false;
            player1up = false;

            player1X-=10;
        }
        if(e.getKeyCode()== KeyEvent.VK_S)
        {
            player1right = false;
            player1left = false;
            player1down = true;
            player1up = false;

            player1Y+=10;
        }
        if(e.getKeyCode()== KeyEvent.VK_D)
        {
            player1right = true;
            player1left = false;
            player1down = false;
            player1up = false;

            player1X+=10;
        }
    }
}

我在 Gameplay 构造函数中添加这些关键监听器,例如

addKeyListener(new player1Listener());

最佳答案

    private final Set<Character> Keyspressed = new HashSet<Character>(); 

    public void keyPressed(KeyEvent e){
            pressed.add(e.getKeyChar());
            if (Keyspressed.size() > 1) {
    //size is greator than one which means you
    //have pressed more than one key. 
    //now your set contains all pressed keys. iterate it and fine out which was pressed.
                   foo(Keyspressed);
                    }
                }
    public void foo(Set<Character> Keyspressed){
    boolean Apressed = false;
    boolean Wpressed = false;
    boolean Spressed = false;
    boolean Dpressed = false;

      for(Character e : Keyspressed){
      if(e==KeyEvent.VK_A){
      Apressed = true; 
      }else if(e==KeyEvent.VK_S){
      Spressed = true;
      }else if(e==KeyEvent.VK_D){
      Dpressed = true; 
      }else if(e==KeyEvent.VK_W){
      Wpressed = true;
        }
      } 
      if(Apressed && Spressed){
      //your logic
         }

      }

您可以将所有按下的按键添加到 set<Character> 中并实现一个函数来迭代按下的按键。

关于java - java中同时按下两个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37393516/

相关文章:

java - 拉格朗日松弛 Cplex 和 Java

java - 使用 javafx 打印日期(作为字符串) - 保持打印当前日期

java - 窗口是在屏幕外绘制的java程序

java - JGoodies FormLayout 和 JWindow

java - 算法在 Java 中有效,但在 C 中无效

java - 当使用 SSL 转移到 mod_proxy_ajp 时,tomcat 停止在 apache 后面提供服务

java - JTable 模型数据未显示更新数据

Java - 清除其他 JList 中的选择

java - 如何在现有 JfreeChart 上方绘制蜘蛛图

java - 在 jtable 单元格内添加微调器