2014-01-02 2 views
1

Люди здесь продолжают предлагать мне использовать ключевые привязки в Java 2D-играх вместо Key Listener.О ключевых привязках в Java

Итак, я узнал об этом, и я хотел бы знать, насколько я правильно понимаю, как его использовать.

Предположим, у меня есть игра с двумя играми, каждый игрок может нажать 5 кнопок.

Игрок 1:

  • UP стрелки - движение вперед
  • ЛЕВЫЙ стрелка - изменить угол движения
  • RIGHT стрелка - изменить угол движения
  • КОСМИЧЕСКИЙ ключ - огневая ракета
  • л ключ - пожар вторичного ракетного

Игрок 2:

  • Вт ключ - двигаться вперед
  • A ключ - угол изменения движения
  • D ключ - угол изменения угла поворота
  • CAPS-LOCK ключ - огонь ракета ключ
  • «Z» - огонь вторичного ракетного

Если я хочу, чтобы программа по-разному реагируют на каждый из различных нажатий клавиш, чем это то, что я что нужно сделать:

  1. Создать новые вложенные классы, простирающиеся AbstractAction, внутри класс, который работает большую часть игровой логики (?).
  2. Создайте экземпляр каждого из этих новых классов и привяжите каждого к ключу.

Это правильно? Действительно ли логично создавать 10 новых классов только для нажатия кнопок? Я хочу знать, правильно ли я понимаю, как использовать привязки клавиш, поэтому я могу начать программирование с ним.

Благодаря

ответ

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 код, изменить переменную, и действие для выполнения, а также ввод в InputMap и ActionMap соответственно.

Я использую оба способа для разных сценариев. Для графики я предпочитаю это выше. Для таких вещей, как меню, я предпочитаю использовать отдельный класс

Взгляните на this example

+0

Я понимаю, что мне нужно создать 10 разных экземпляров. Но мне нужно создать 10 разных * классов *? (each with instance?) – user3150201

+0

Что вы написали выше: Что он делает? Создает ли он новый класс с именем leftAction, расширяет AbstractAction? Или он создает новый экземпляр AbstractAction, а затем переопределяет actionPerformed() для этого конкретного экземпляра? – user3150201

+0

Ну технически с кодом выше вы создаете анонимный класс. вам нужно будет повторить верхнюю часть моего кода 10 раз для различных действий. –

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

+0

[не уверен, пожалуйста, чтобы увидеть пример кода] (http://stackoverflow.com/a/7940227/714968) – mKorbel

1

Personaly, когда я использую сочетания клавиш Я хотел бы создать внутренний класс, расширяющий abstractAction для каждого действия, а затем создать экземпляр этого внутреннего класса и привязать его к например, например, put("left", ActionLeft);. Так что в основном я сделал два шага, которые вы описали, и это сработало.

Вы также можете просто создать экземпляры классов анонимуса, а затем связать эти экземпляры точно так же.

Смежные вопросы