我正在尝试制作一个可以使用WASD键移动的游戏,起初我尝试使用JFrame上的KeyListener进行操作,但是它随机停止了。然后,我发现this solution似乎可以解决我的问题,但是在对其进行调整之后,它仍然会随机停止工作...
这是我两次尝试的代码。
第一次尝试:
private class GameKeyListener implements KeyListener{
@Override
public void keyTyped(KeyEvent e) {}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("Pressed " + e.getKeyChar());
switch(e.getKeyChar()) {
case 'w':
goUp = true;
break;
case 'a':
goLeft = true;
break;
case 's':
goDown = true;
break;
case 'd':
goRight = true;
break;
}
}
@Override
public void keyReleased(KeyEvent e) {
switch(e.getKeyChar()) {
case 'w':
goUp = false;
break;
case 'a':
goLeft = false;
break;
case 's':
goDown = false;
break;
case 'd':
goRight = false;
break;
}
}
}
第二次尝试:
...
KeyStroke[] pressed = new KeyStroke[]{
KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, false),
KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false),
KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, false),
KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false)
};
KeyStroke[] released = new KeyStroke[]{
KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, true),
KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true),
KeyStroke.getKeyStroke(KeyEvent.VK_S, 0, true),
KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true)
};
InputMap inputMap = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = panel.getActionMap();
for(KeyStroke k : pressed) {
String key = "p" + k.getKeyCode();
inputMap.put(k, key);
actionMap.put(key, new UpAction(false, k.getKeyCode()));
}
for(KeyStroke k : released) {
String key = "r" + k.getKeyCode();
inputMap.put(k, key);
actionMap.put(key, new UpAction(true, k.getKeyCode()));
}
}
private class UpAction extends AbstractAction {
private static final long serialVersionUID = -110890480129966855L;
private boolean onKeyRelease;
private int key;
public UpAction(boolean onKeyRelease, int key) {
this.onKeyRelease = onKeyRelease;
this.key = key;
}
@Override
public void actionPerformed(ActionEvent evt) {
System.out.print(onKeyRelease + "/" + key);
switch(key) {
case KeyEvent.VK_W:
goUp = !onKeyRelease;
break;
case KeyEvent.VK_A:
goLeft = !onKeyRelease;
break;
case KeyEvent.VK_S:
goDown = !onKeyRelease;
break;
case KeyEvent.VK_D:
goRight = !onKeyRelease;
break;
}
}
}