簡體   English   中英

關於Java中的鍵綁定

[英]About Key Bindings in Java

這里的人們不斷建議我在Java 2D游戲中使用“鍵綁定”,而不是“鍵偵聽器”。

所以我學會了它,我想知道我是否正確地理解了如何使用它。

假設我有一個游戲,有兩個游戲,每個玩家可以按5個按鈕。

玩家1:

  • 向上箭頭-向前移動
  • 箭頭-更改運動角度
  • 向右箭頭-更改運動角度
  • SPACE鍵-射擊導彈
  • L鍵-火力輔助導彈

玩家2:

  • W鍵-前進
  • 一個關鍵-改變運動角度
  • D鍵-改變運動角度
  • CAPS-LOCK鍵-射擊導彈
  • Z鍵-射擊輔助導彈

如果我希望程序對每個不同的按鍵做出不同的反應,那么我要做的是:(?)

  1. 在運行大多數游戲邏輯的類中,創建10個擴展AbstractAction的新嵌套類。
  2. 為這10個新類中的每一個創建一個實例,並將每一個綁定到一個鍵。

這個對嗎? 僅為按鈕創建10個新類真的合乎邏輯嗎? 我想知道我是否正確理解如何使用鍵綁定,所以我可以開始使用它進行編程。

謝謝

“這是正確的嗎?只為按鈕創建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

我針對不同的情況使用兩種方法。 對於圖形,我更喜歡上面的方式。 對於菜單之類的東西,我傾向於使用單獨的類

這個例子

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!");
        }
    }
}

這里取

個性而言,當我使用keyBindings時,我將創建一個內部類,為每個操作擴展abstractAction,然后創建該內部類的實例,並將其綁定到諸如put("left", ActionLeft);類的鍵上put("left", ActionLeft); , 例如。 因此,基本上,我完成了您描述的兩個步驟,並且都成功了。

您也可以只創建匿名類的實例,然后以相同的方式綁定這些實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM