Marty_01
Marty_01

Reputation: 213

Multiple keys pressed in Java

I'm trying to make a simple game and I need to check if multiple keys are pressed. A similar question received the following answer:

class MultiKeyPressListener implements KeyListener {

    // Set of currently pressed keys
    private final Set<Character> pressed = new HashSet<Character>();

    @Override
    public synchronized void keyPressed(KeyEvent e) {
        pressed.add(e.getKeyChar());
        if (pressed.size() > 1) {
            // More than one key is currently pressed.
            // Iterate over pressed to get the keys.
        }
    }

    @Override
    public synchronized void keyReleased(KeyEvent e) {
        pressed.remove(e.getKeyChar());
    }

    @Override
        public void keyTyped(KeyEvent e) {/* Not used */ }
    }
}

How do I "iterate over pressed to get the keys"? I came up with the following:

// declarations

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

// code

    @Override
    public synchronized void keyPressed(KeyEvent e) {               
        pressed.add(e.getKeyChar());

        if(pressed.contains(KeyEvent.VK_UP)) {  
            switch(e.getKeyCode()) {
            case KeyEvent.VK_LEFT: 
                starfighter.moveUpLeft();
                break;
            case KeyEvent.VK_RIGHT:
                starfighter.moveUpRight();
                break;
            }
        }
    }

but this doesn't work. How can I make this work?

Thanks

Upvotes: 0

Views: 1570

Answers (1)

Dušan Rychnovsk&#253;
Dušan Rychnovsk&#253;

Reputation: 12509

How about:

class MultiKeyPressListener implements KeyListener {

  // Set of currently pressed keys
  private final Set<Integer> pressed = new HashSet<Integer>();

  @Override
  public synchronized void keyPressed(KeyEvent e) {
    pressed.add(e.getKeyCode());

    if (pressed.contains(KeyEvent.VK_UP)) {
      if (pressed.contains(KeyEvent.VK_LEFT)) {
        starfighter.moveUpLeft();
      }
      if (pressed.contains(KeyEvent.VK_RIGHT)) {
        starfighter.moveUpRight();
      }
    }
  }

  @Override
  public synchronized void keyReleased(KeyEvent e) {
    pressed.remove(e.getKeyCode());
  }

  @Override
    public void keyTyped(KeyEvent e) {/* Not used */ }
  }
}

Note how you have a set of Integers instead of Characters and store key codes instead of key characters.

Upvotes: 2

Related Questions