如何让多个Key Binding同时工作?

我需要设计一个有两个玩家的游戏。 每个都有一个球,应该能够向右或向左移动球,第一个玩家带有’a”d’按钮,第二个玩家有右箭头按钮。 然而,目前一名球员需要等待其他球员的动作完成才能移动他们自己的球。 我该如何解决这个问题? 这是我的代码的相关部分:

public class AnimationWindow extends JPanel{ public AnimationWindow() { super(); .... .... cezmiMover(); } public void cezmiMover(){ this.getInputMap().put(KeyStroke.getKeyStroke('a'), "left1"); this.getActionMap().put("left1", new AbstractAction() { public void actionPerformed(ActionEvent e) { board.cezmi1.moveLeft(); } }); this.getInputMap().put(KeyStroke.getKeyStroke('d'), "right1"); this.getActionMap().put("right1", new AbstractAction() { public void actionPerformed(ActionEvent e) { board.cezmi1.moveRight(); } }); this.getInputMap().put(KeyStroke.getKeyStroke("LEFT"), "left2"); this.getActionMap().put("left2", new AbstractAction() { public void actionPerformed(ActionEvent e) { board.cezmi2.moveLeft(); } }); this.getInputMap().put(KeyStroke.getKeyStroke("RIGHT"), "right2"); this.getActionMap().put("right2", new AbstractAction() { public void actionPerformed(ActionEvent e) { board.cezmi2.moveRight(); } }); } } 

您需要使用一系列标志和某种“更新”循环来根据标志的状态更新游戏状态…

例如,首先创建一系列标志……

 private boolean p1Left, p1Right, p2Left, p2Right = false; 

这些可以通过单个玩家对象轻松维护,但是你没有提供那么多代码……

接下来,您需要监控按键和按键释放事件,并根据需要设置标志的状态…

 this.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "right1down"); this.getActionMap().put("right1down", new AbstractAction() { public void actionPerformed(ActionEvent e) { p1Right = true; } }); this.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "right1up"); this.getActionMap().put("right1up", new AbstractAction() { public void actionPerformed(ActionEvent e) { p1Right = false; } }); 

然后你需要一些可以更新游戏状态的循环或计时器。 就个人而言,我喜欢使用javax.swing.Timer ,但那只是我。

在每次运行更新循环时,您需要检查每个标志的状态并相应地更新对象…

 if (p1Right) { board.cezmi1.moveRight(); } 

例如

使用键盘查看动作 。 KeyboardAnimation.java代码包含一个完整的工作示例,演示了一种方法。

KeyboardAnimation类的每个实例:

  1. 使用Timer为组件(JLabel)设置动画
  2. 动画由指定的KeyStrokes控制
  3. Map跟踪已按下的KeyStrokes,同时处理多个KeyStrokes