Reputation: 213
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
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