我正在制作一款小型的2人游戏,其中一个玩家使用WASD控制,而另一个则使用箭头键控制。首先,我使用 KeyListener 处理我的输入,但是我很快意识到它无法识别同时输入。然后,我做了一些研究,发现 KeyBindings 是同时输入的一个很好的选择。我使用站点Motion Using the Keyboard弄清楚了如何使用此功能,并且在中途我意识到此解决方案存在问题。该网站指出
假设您有一个要使用箭头键控制的组件,而另一个要使用W / A / S / D进行控制的组件。使用键绑定时这没问题。您只需创建另一个MotionWithKeyBindings并为这四个键分配绑定,就可以了。
这意味着我必须为每个玩家分配2个不同的 JComponent 对象。目前,我的 InputMap 和 ActionMap 都从我两个播放器都处于打开状态的单个JPanel中检索到。使我的两个玩家都成为单独的 JComponent 对象的唯一解决方案?如果是这样,我将如何去做?这是我的 KeyBindings 代码:
public void setKeyBindings(InputMap im, ActionMap am) {
if (id == 1) { // id is a unique number granted to players 1 and 2
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "LEFT");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "RIGHT");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_W, 0, false), "UP");
am.put("LEFT", new AbstractAction() {
public void actionPerformed(ActionEvent arg0) {
xVel = -3;
}
});
am.put("RIGHT", new AbstractAction() {
public void actionPerformed(ActionEvent arg0) {
xVel = 3;
}
});
am.put("UP", new AbstractAction() {
public void actionPerformed(ActionEvent arg0) {
if (!jumping) {
jumping = true;
yVel = -10;
}
}
});
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), "LEFT_RELEASED");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "RIGHT_RELEASED");
am.put("LEFT_RELEASED", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
xVel = 0;
}
});
am.put("RIGHT_RELEASED", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
xVel = 0;
}
});
}
if (id == 2) {
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, false), "LEFT_2");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, false), "RIGHT_2");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "UP_2");
am.put("LEFT_2", new AbstractAction() {
public void actionPerformed(ActionEvent arg0) {
xVel = -3;
}
});
am.put("RIGHT_2", new AbstractAction() {
public void actionPerformed(ActionEvent arg0) {
xVel = 3;
}
});
am.put("UP_2", new AbstractAction() {
public void actionPerformed(ActionEvent arg0) {
if (!jumping) {
jumping = true;
yVel = -10;
}
}
});
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0, true), "LEFT_RELEASED_2");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0, true), "RIGHT_RELEASED_2");
am.put("LEFT_RELEASED_2", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
xVel = 0;
}
});
am.put("RIGHT_RELEASED_2", new AbstractAction() {
public void actionPerformed(ActionEvent e) {
xVel = 0;
}
});
}
}