Java-使用键绑定的多个输入

时间:2018-07-11 10:33:50

标签: java keyboard game-engine

我正在制作一款小型的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;
            }
        });
    }
}

0 个答案:

没有答案