1

I am developing a simple 2D game which contain two players. I am moving player 1 with keys W, A, S and D. Other players is controlled by arrow keys.

The problem I am facing is that when any of the arrow key is kept pressed for moving player 2, keys W, S, D and A does work for player 1 and vice versa.

I have seen some answers like this, but it didn't resolved my problem.

I have a main class Gameplay and made two inner class Player1Listener and Player2Listener (implementing KeyListener).

Example code for one class is shown below, other sub class looks like same.

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;
        }
    }
}

I am adding these key listeners in Gameplay constructor like

addKeyListener(new player1Listener());
Community
  • 1
  • 1
Umair Jameel
  • 1,573
  • 3
  • 29
  • 54

1 Answers1

1
    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
         }

      }

you can add all the pressed keys into a set<Character> and implement a function to iterate over the pressed Keys.

Priyamal
  • 2,919
  • 2
  • 25
  • 52