Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество
Главная
    Статьи
        Основы
            Работа с Клавиатурой

Работа с Клавиатурой

Опубликованно: 19.09.2015, 1:59
Последняя редакция, AdiDOS: 05.05.2016 8:02

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


package test;

import com.jme3.app.SimpleApplication;
import com.jme3.font.BitmapFont;
import com.jme3.font.BitmapText;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.AnalogListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.math.ColorRGBA;

public class TestKeyboard extends SimpleApplication implements ActionListener, AnalogListener{
 BitmapText text;
 String strTemp = new String();

 public static void main(String[] args) {
   new TestKeyboard().start();
 }

@Override
 public void simpleInitApp() {
   //Назначение кнопок клавиатуры
   inputManager.addMapping("key_s", new KeyTrigger(KeyInput.KEY_S));
   inputManager.addListener(this, "key_s");
   inputManager.addMapping("key_q_e", new KeyTrigger(KeyInput.KEY_Q), new KeyTrigger(KeyInput.KEY_E));
   inputManager.addListener(this, "key_q_e");
   inputManager.addMapping("key_enter", new KeyTrigger(KeyInput.KEY_RETURN));
   inputManager.addListener(this, "key_enter");
   inputManager.addMapping("key_clear", new KeyTrigger(KeyInput.KEY_SPACE));
   inputManager.addListener(this, "key_clear");

   inputManager.addMapping("key_delete", new KeyTrigger(KeyInput.KEY_DELETE));
   inputManager.addListener(this, "key_delete");
  //inputManager.addListener(this, new String[]{"key_s", "key_q_e", "key_enter", "key_clear", "key_delete"});
  createText();

 }

@Override
 public void onAction(String name, boolean isPressed, float tpf) {
 //Кнопка S
 if (name.equals("key_s") && isPressed){
   addText("s");
 }
 //Кнопки Q и Е
 if (name.equals("key_q_e") && isPressed){
   addText(name);
 }
 //Кнопка Энтер
 if (name.equals("key_enter") && isPressed){
   addText("\n");
 }
 //Кнопка Пробел
 if (name.equals("key_clear") && !isPressed){
   clearText();
 }
 //Кнопка Delete
 if (name.equals("key_delete") && !isPressed){
   inputManager.deleteMapping("key_s");
   inputManager.deleteMapping("key_q_e");
   inputManager.deleteMapping("key_enter");
   inputManager.deleteMapping("key_space");
   inputManager.deleteMapping("key_delete");

   inputManager.removeListener(this);
 }

 }
 //Создание текста
 private void createText(){
   BitmapFont font = assetManager.loadFont("Interface/Fonts/Default.fnt");
   text = new BitmapText(font, false);
   text.setText("JME3 Keyboard Test !!!!");
   text.setColor(ColorRGBA.Green);
   updatePosText();
   guiNode.attachChild(text);
 }
 //Добавление текста
 private void addText(String str){
   strTemp += ' ' + str;
   text.setText(strTemp);
   updatePosText();
 }
 //Очистка текста
 private void clearText(){
   strTemp = "";
   text.setText(strTemp);
   updatePosText();
 }
 //Обновление позиции текста
 private void updatePosText(){
   int w = settings.getWidth();
   int h = settings.getHeight();
   text.setLocalTranslation(w / 2 - text.getLineWidth() / 2, h / 2 + text.getLineHeight() / 2, 0);
 }

 @Override
 public void onAnalog(String name, float value, float tpf) {
   System.out.println("This analog event");
 }
}

Этот код демонстрирует обработку событий клавиатуры , перед тем как назначить обработчик событий мы должны назначить триггер в его входит константа которая указывает на кнопку клавиатуры , все константы описаны в интерфейсе KeyInput , далее с помощью метода addMapping мы добавляем имя и триггер , таким образом мы связываем определенное имя к определенной кнопке на клавиатуре , это нужно для того чтобы при определенных событиях кнопок мы получали не индекс клавиатуры а логическое имя.

Ну а далее идет назначение события с помощью метода  addListener , где первый входящий параметр интерфейс InputListener , на данный момент есть два наследника этого интерфейса это ActionListener и AnalogListener.

Метод onAction вызывается когда нажимаем кнопку или отжимаем , параметр name возвращает имя нажатой кнопки привязанное функцией addMapping , по втором параметру isPressed можно определять состояние кнопки нажата она или нет.


public interface ActionListener extends InputListener {
  public void onAction(String name, boolean isPressed, float tpf);

Метод onAnalog вызывается постоянно при нажатой кнопки в зависимости от ваших кадров в секунду при 60 fps и удерживании кнопки клавиатуры 1 секунду метод вызывается 60 раз , первый параметр как и в onAction имя нажатой кнопки , а второй параметр value он определяет время между вызовом метода , допустим при частоте 60fps параметр value должен быть равен 1/60=0.016 сек.

public interface AnalogListener extends InputListener {
   public void onAnalog(String name, float value, float tpf);
}

Добавление триггера под именем «key_s» и кнопкой S.

  addMapping("key_s", new KeyTrigger(KeyInput.KEY_S));

Здесь добавляем сразу два триггера под одним именем «key_q_e» и двумя кнопками Q и E.

  addMapping("key_q_e", new KeyTrigger(KeyInput.KEY_Q), new KeyTrigger(KeyInput.KEY_E));

Добавление обработчика события параметр this говорит о том что интерфейсы ActionListener и AnalogListener  находятся в текущем классе, второй параметр указываем имя триггера .

  addListener(this, "key_enter");

Как вы видите единственная разница в имени и как вы заметили что можно назначить сразу массив триггеров на одно имя а так же чтоб не вызывать постоянно функцию addListener с именем триггера можно назначить сразу массив имен.

  inputManager.addListener(this, new String[]{"key_s", "key_q_e", "key_enter", "key_clear", "key_delete"});

В коде я при нажатии кнопок выполняю определенные действия с выводом текста на экране .

По нажатию кнопки S мы добавляем текст на экран

//Кнопка S
 if (name.equals("key_s") && isPressed){
   addText("s");
 }

По нажатию кнопки Q или E мы добавляем текст на экран

//Кнопки Q и Е
 if (name.equals("key_q_e") && isPressed){
  addText(name);
 }

По нажатию кнопки Enter мы добавляем перенос строки

//Кнопка Энтер
 if (name.equals("key_enter") && isPressed){
  addText("\n");
 }

По нажатию кнопки Пробел очищаем текст на экране

//Кнопка Пробел
 if (name.equals("key_clear") && !isPressed){
   clearText();
 }

По нажатию кнопки Delete удаляем все триггеры и интерфейс обработчика событий .

//Кнопка Delete
 if (name.equals("key_delete") && !isPressed){
   inputManager.deleteMapping("key_s");
   inputManager.deleteMapping("key_q_e");
   inputManager.deleteMapping("key_enter");
   inputManager.deleteMapping("key_space");
   inputManager.deleteMapping("key_delete");

   inputManager.removeListener(this);
  }
 }

1

2

Как вы видите все довольно просто и на мое мнение удобно , если что то не ясно лучше взять и попробовать.

Спасибо за внимание !!!

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.