Обработка событий позволяет получить более детальную и прежде всего хронологическую информация о входных данных от пользователя. Обработка событий обеспечивает способ реализации взаимодействия с пользовательским интерфейсом, где важны конкретные последовательности ввода, например зажатие кнопки и затем отпускание означает, что пользователь нажал кнопку. Такое взаимодействие трудно реализовать с помощью опроса.
Процессор ввода
Обработка событий осуществляется с помощью общего шаблона наблюдателя. Сначала мы должны реализовать интерфейс обработчик называемый 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
.