关于Java中的键绑定

时间:2014-01-02 13:09:42

标签: java awt key-bindings

这里的人们一直建议我在Java 2D游戏中使用Key Binding而不是Key Listener。

所以我学会了它,我想知道我是否正确理解如何使用它。

让我们说我有一个游戏,有两个游戏,每个玩家可以按5个按钮。

玩家1:

  • UP arrow - 前进
  • LEFT 箭头 - 改变运动角度
  • RIGHT 箭头 - 改变运动角度
  • SPACE key - fire missile
  • L 钥匙 - 火力二次导弹

玩家2:

  • W key - 前进
  • A 键 - 更改移动角度
  • D 键 - 改变移动角度
  • CAPS-LOCK key - fire missile
  • ' Z'关键 - 火力二次导弹

如果我希望程序对每个不同的按键操作做出不同的反应,那么这就是我要做的事情:(?)

  1. 在里面创建扩展AbstractAction的 10 新嵌套类 运行大部分游戏逻辑的类。
  2. 创建一个实例 这些 10 新类中的每一个,并将每个类绑定到一个键。
  3. 这是对的吗?为推按钮创建10个新类是否合乎逻辑? 我想知道我是否正确理解如何使用Key Bindings,所以我可以开始使用它进行编程。

    由于

3 个答案:

答案 0 :(得分:3)

  

“这是正确的吗?仅为推按钮创建10个新类是否合乎逻辑?”

答案是肯定的。您需要创建10个不同的实例。这并不困难。你可以创建一个帮助类,也可以只复制和粘贴这样的东西

Action leftAction = new AbstractAction(){
    public void actionPerformed(ActionEvent e){
        // do something when left button pressed;
    }
};

InputMap inputMap = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
ActionMap actionMap = panel.getActionMap();

inputMap.put(KeyStroke.getKeyStroke("LEFT"), "leftAction");
actionMap.put("leftAction", leftAction);  <----

对于每个不同的操作,只需复制并粘贴Action代码,更改变量以及要执行的操作,然后相应地输入InputMapActionMap

我对不同的场景使用两种方式。对于图形我更喜欢上述方式。对于像菜单这样的东西,我倾向于使用单独的类

查看this example

答案 1 :(得分:2)

public TestKeyBindings02() {
    JPanel panel = new JPanel();
    InputMap im = panel.getInputMap(JPanel.WHEN_IN_FOCUSED_WINDOW);
    ActionMap am = panel.getActionMap();

    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_RIGHT, 0), "RightArrow");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_LEFT, 0), "LeftArrow");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0), "UpArrow");
    im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0), "DownArrow");

    am.put("RightArrow", new ArrowAction("RightArrow"));
    am.put("LeftArrow", new ArrowAction("LeftArrow"));
    am.put("UpArrow", new ArrowAction("UpArrow"));
    am.put("DownArrow", new ArrowAction("DownArrow"));
}

public class ArrowAction extends AbstractAction {

    private String cmd;

    public ArrowAction(String cmd) {
        this.cmd = cmd;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (cmd.equalsIgnoreCase("LeftArrow")) {
            System.out.println("The left arrow was pressed!");
        } else if (cmd.equalsIgnoreCase("RightArrow")) {
            System.out.println("The right arrow was pressed!");
        } else if (cmd.equalsIgnoreCase("UpArrow")) {
            System.out.println("The up arrow was pressed!");
        } else if (cmd.equalsIgnoreCase("DownArrow")) {
            System.out.println("The down arrow was pressed!");
        }
    }
}

取自here

答案 2 :(得分:1)

Personaly,当我使用keyBindings时,我会为每个动作创建一个扩展abstractAction的内部类,然后创建这个内部类的实例并将其绑定到像put("left", ActionLeft);这样的键。所以基本上我做了你描述的两个步骤,并且有效。

您也可以创建匿名类的实例,然后以相同的方式绑定这些实例。