Вторник, 2024-03-19, 8:12 AM

Поиск
Меню
Категории раздела
Поддержи проект!
Рекомендуем


Обработка событий

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

Процессор ввода

Обработка событий осуществляется с помощью общего шаблона наблюдателя. Сначала мы должны реализовать интерфейс обработчик называемый InputProcessor:

public class MyInputProcessor implements InputProcessor {
   @Override
   public boolean keyDown (int keycode) {
      return false;
   }

   @Override
   public boolean keyUp (int keycode) {
      return false;
   }

   @Override
   public boolean keyTyped (char character) {
      return false;
   }

   @Override
   public boolean touchDown (int x, int y, int pointer, int button) {
      return false;
   }

   @Override
   public boolean touchUp (int x, int y, int pointer, int button) {
      return false;
   }

   @Override
   public boolean touchDragged (int x, int y, int pointer) {
      return false;
   }

   @Override
   public boolean touchMoved (int x, int y) {
      return false;
   }

   @Override
   public boolean scrolled (int amount) {
      return false;
   }
}

Первые три метода позволяют перехватывать события клавиатуры:

  • keyDown(): вызывается когда клавиша была нажата. Сообщает код клавиши, который можно найти в Keys классе.
  • keyUp(): вызывается когда клавиша была отпущена. Сообщает код клавиши, как указано выше.
  • keyTyped(): вызывается когда был сгенерирован Unicode символ при вводе с клавиатуры. Это может быть использовано для реализации текстовых полей и аналогичных элементов пользовательского интерфейса.

Следующие три метода сообщают о событиях мыши и сенсорного экрана:

  • touchDown(): вызывается когда палец коснулся экрана или была нажата кнопка мыши. Сообщает последние известные координаты, а также индекс указателя и кнопку мыши (для сенсорных экранов всегда Buttons.LEFT).
  • touchUp(): вызывается когда палец был убран с экрана или кнопки мыши был отпущена. Сообщает последние известные координаты, а также индекс указателя и кнопку мыши (для сенсорных экранов всегда Buttons.LEFT).
  • touchDragged(): вызывается когда палец перемещается по экрану или перемещается мышь с нажатой кнопкой. Какая была нажата кнопка не сообщается, так как во время движением могло быть нажато несколько кнопок. Вы можете использовать Gdx.input.isButtonPressed() метод для проверки определенной кнопки.
  • touchMoved(): вызывается когда мышь перемещается по экрану без нажатой кнопки. Это событие имеет значение только на персональном компьютере и никогда не будет вызываться на устройствах с сенсорным экраном, где вы можете получить только touchDragged() событие.
  • scrolled(): вызывается когда совершается прокрутка колеса мыши. Сообщает значение −1 или 1, в зависимости от направления вращения. Этот метод никогда не вызывается для устройств с сенсорным экраном.

Каждый из методов возвращает boolean значение. Мы изучим, почему это так в InputMultiplexer разделе.

После реализации InputProcessor нужно сказать об этом libgdx, чтобы он мог вызвать ее, когда придет новое событие.

MyInputProcessor inputProcessor = new MyInputProcessor();
Gdx.input.setInputProcessor(inputProcessor);

С этого момента все новые события ввода будет сообщаться MyInputProcessor экземпляру.

InputMultiplexer

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

InputMultiplexer multiplexer = new InputMultiplexer();
multiplexer.addProcessor(new MyUiInputProcessor());
multiplexer.addProcessor(new MyGameInputProcessor());
Gdx.input.setInputProcessor(multiplexer);

Класс InputMultiplexer будет перенаправлять новые события первому InputProcessor. Если этот процессор вернет false из вызванного метода обработки события, это указывает на то, что событие не было обработано и мультиплексор передаст событие другому процессору. Благодаря этому механизму, MyUiInputProcessor может обрабатывать любые события, которые исходят от элементов управления и передавать любые другие события в MyGameInputProcessor.