在java中同时按下两个键

在java中同时按下两个键,java,swing,Java,Swing,我正在开发一个包含两名玩家的简单2D游戏。我用W、A、S和D键移动播放器1。其他播放器由箭头键控制 我面临的问题是,当按下任意箭头键移动播放器2时,键W、S、D和A对播放器1起作用,反之亦然。 我看到了一些类似的答案,但它并没有解决我的问题 我有一个主类游戏,并制作了两个内部类Player1Listener和Player2Listener(实现KeyListener) 下面显示了一个类的示例代码,其他子类的代码与此类似 private class Player1Listener implemen

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

我面临的问题是,当按下任意箭头键移动播放器2时,键W、S、D和A对播放器1起作用,反之亦然。

我看到了一些类似的答案,但它并没有解决我的问题

我有一个主类游戏,并制作了两个内部类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;
        }
    }
}
我在游戏性构造器中添加了这些关键侦听器,如

addKeyListener(new player1Listener());
private final Set Keyspressed=new HashSet();
按下公共无效键(按键事件e){
添加(例如getKeyChar());
如果(按下键.size()>1){
//尺寸比一大,这意味着你
//已按下多个键。
//现在,您的集合包含所有按下的键。对其进行迭代并确定按下的键。
foo(按键);
}
}
公共无效foo(按下设置键){
布尔值Apressed=false;
布尔Wpressed=false;
布尔存储=假;
布尔值Dpressed=false;
用于(字符e:按下键){
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=真;
}
} 
if(预压和预压(&P){
//你的逻辑
}
}

您可以将所有按下的键添加到
集合中
,并实现一个函数来迭代按下的键。

使用键绑定而不是KeyListener:可能重复。
    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
         }

      }