Коды игровых манипуляторов


    Описание       Кнопки     Файлы устройств  

Описание геймпада

Примечания.

  • 1. Описание геймпада основано на переводе руководства: Handle controller actions

  • 2. Файлы .kl с кодами кнопок - из папки Keylayout для ТВ-бокса T95ZPlus
    Управление действиями контроллера

    На системном уровне Android сообщает коды входных событий от игровых контроллеров в виде кодов клавиш Android и значений осей. В игре получают эти коды и значения и преобразовывают их в определенные внутриигровые действия.

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

    Игра может получать эти входные события, реализуя следующие методы обратного вызова в активном Activity или фокусном View (должны быть реализованы обратные вызовы для Activity или View, но не для обоих).

    Рекомендуемый подход заключается в захвате событий от конкретного объекта View, с которым взаимодействует пользователь. Проверяются следующие объекты, предоставляемые обратными вызовами, чтобы получить информацию о типе полученного события ввода:

  • Из Activity:

    dispatchGenericMotionEvent ( android.view. MotionEvent) - вызывается для обработки общих событий движения, таких как движения джойстика.

    dispatchKeyEvent( android.view.KeyEvent) - вызывается для обработки событий, таких как нажатие или отпускание кнопки геймпада или крестовины.

  • Из View:

    onGenericMotionEvent( android.view.MotionEvent) - вызывается для обработки общих событий движения, таких как движения джойстика.

    onKeyDown(int, android.view.KeyEvent) - вызывается для обработки нажатия физической клавиши, например кнопки геймпада или крестовины.

    onKeyUp(int, android.view.KeyEvent) - вызывается для обработки отпускания физической клавиши, например кнопки геймпада или крестовины.

    Рекомендуемый подход заключается в захвате событий из определенного объекта View, с которым взаимодействует пользователь. Проверяются следующие объекты, предоставляемые обратными вызовами, чтобы получить информацию о типе полученного события ввода:

    KeyEvent

    Объект, описывающий джойстик (крестовину) и события кнопок геймпада. События сопровождаются кодом клавиши, указывающим, что сработала конкретная кнопка, например DPAD_DOWN или BUTTON_A. Можно получить код кнопки, вызвав getKeyCode() или из обратных вызовов событий, таких как onKeyDown().

    MotionEvent

    Объект, описывающий входные данные от движений джойстика и плечевого триггера. События движения сопровождаются кодом действия и набором значений оси. Код действия определяет произошедшее изменение состояния, например перемещение джойстика.

    Значения оси описывают положение и другие свойства движения для определенного физического элемента управления, например AXIS_X или AXIS_RTRIGGER.

    Можно получить код действия, вызвав getAction() и значение оси, вызвав getAxisValue().

    Как обрабатывать ввод от наиболее распространенных типов физических элементов управления (кнопки геймпада, панели управления и джойстики) на игровом экране, реализуя вышеупомянутые методы View обратного вызова, а также обработку KeyEvent и объекты MotionEvent.

    При сообщении о входных событиях Android не делает различий между событиями, пришедшими с устройства, не являющегося игровым контроллером, и событиями, пришедшими с игрового контроллера.

    Например, действие сенсорного экрана генерирует событие AXIS_X , представляющее координату X сенсорной поверхности, а джойстик генерирует событие AXIS_X , представляющее положение X джойстика. Если игра заботится об обработке ввода игрового контроллера, то нужно сначала убедиться, что событие ввода исходит из соответствующего типа источника.


    Как проверить, что игровой контроллер подключен

    Чтобы убедиться, что подключенное устройство ввода является игровым контроллером, делается вызов getSources() для получения комбинированного битового поля типов источников ввода, поддерживаемых на этом устройстве.

    Затем можно проверить, установлены ли следующие поля:

    1. Тип источника SOURCE_GAMEPAD указывает, что на устройстве ввода есть кнопки геймпада (например, BUTTON_A). Обратите внимание, что этот тип источника строго не указывает, есть ли на игровом контроллере кнопки D-Pad, хотя большинство геймпадов обычно имеют элементы управления направлением.

    2. Тип источника SOURCE_DPAD указывает, что на устройстве ввода есть крестовина (например, DPAD_UP).

    3. Тип источника SOURCE_JOYSTICK указывает на то, что устройство ввода имеет аналоговые джойстики управления (например, джойстик, записывающий движения вдоль AXIS_X и AXIS_Y).

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

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


    Процесс нажатия кнопок геймпада

    Основные элементы управления геймпада:

    D-pad (direction pad) — кнопка-крестовина, объединяющая в себе четыре кнопки (иногда восемь). Предназначена для управления движением.
  • Кнопки действия (action buttons) — дают возможность взаимодействовать с объектами игрового мира
  • Триггеры (спусковые крючки) — кнопки, располагаемые под указательными пальцами (часто отвечают за стрельбу). На геймпадах появились с увеличением сложности игр, чтобы отделить функцию стрельбы от общих действий. Нередко к триггерам привязываются и другие функции, которые удобно отделять от основных функций, привязанных к кнопкам действия.
  • Микроджойстик (аналоговый стик) — рычажок, отслеживающий движение по двум осям, X и Y. Не имеет каких-либо дополнительных кнопок, за исключением возможности нажатия на сам стик.
  • Служебные кнопки Start, Select, Mode, Back — кнопки, обеспечивающие контроль над самим игровым процессом (пауза во время игры, вызов меню опций игры, смена режима работы геймпада).

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




    Номера на рисунке относятся к следующему:

  • 1. AXIS_HAT_X, AXIS_HAT_Y, DPAD_UP, DPAD_DOWN, DPAD_LEFT, DPAD_RIGHT
  • 2. AXIS_X, AXIS_Y, BUTTON_THUMBL
  • 3. AXIS_Z, AXIS_RZ, BUTTON_THUMBR
  • 4. BUTTON_X
  • 5. BUTTON_A
  • 6. BUTTON_Y
  • 7. BUTTON_B
  • 8. BUTTON_R1
  • 9. AXIS_RTRIGGER, AXIS_THROTTLE
  • 10. AXIS_LTRIGGER, AXIS_BRAKE
  • 11. BUTTON_L1

    Общие коды клавиш, генерируемые нажатием кнопок геймпада, включают BUTTON_A, BUTTON_B, BUTTON_SELECT и BUTTON_START.

    Некоторые игровые контроллеры также запускают код клавиши DPAD_CENTER при нажатии на центр перекладины крестовины.

    Игра может проверять код кнопки, вызывая getKeyCode() или из обратных вызовов событий кнопки, таких как onKeyDown(), и, если он представляет событие, относящееся к игре, обрабатывать его как игровое действие.


    Обработка ввода D-Pad (крестовины)

    4-позиционная навигационная панель (крестовина, D-Pad) является обычным физическим элементом управления во многих игровых контроллерах.

    Android сообщает о нажатиях крестовины ВВЕРХ и ВНИЗ как о AXIS_HAT_Y событиях с диапазоном от -1,0 (вверх) до 1,0 (вниз), а о нажатиях крестовины ВЛЕВО или ВПРАВО как о AXIS_HAT_X событиях с диапазоном от -1,0 (влево) до 1,0 (вправо).

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

    Рекомендуемые игровые действия по умолчанию для кодов клавиш крестовины и значений оси хат-переключателя.

    Действие игры - Код клавиши крестовины - Код оси HAT

  • Вверх - KEYCODE_DPAD_UP - AXIS_HAT_Y (для значений от 0 до -1,0)
  • Вниз - KEYCODE_DPAD_DOWN - AXIS_HAT_Y (для значений от 0 до 1,0)
  • Bлево - KEYCODE_DPAD_LEFT - AXIS_HAT_X (для значений от 0 до -1,0)
  • Вправо - KEYCODE_DPAD_RIGHT - AXIS_HAT_X (для значений от 0 до 1,0)


    Обработка движений джойстика

    Когда игроки перемещают джойстик на своих игровых контроллерах, Android сообщает о MotionEvent, содержащем код действия ACTION_MOVE и обновленные положения осей джойстика. Игра может использовать данные, предоставленные MotionEvent, чтобы определить, произошло ли движение джойстика, который она отслеживает.

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

    При сообщении о событиях движения с кодом действия ACTION_MOVE (например, о движениях джойстика) Android группирует значения по осям для повышения эффективности. Исторические значения для оси состоят из набора различных значений, более старых, чем текущее значение оси, и более поздних, чем значения, сообщаемые в любых предыдущих событиях движения.

    Можно использовать историческую информацию для более точной визуализации движения игрового объекта на основе ввода с помощью джойстика. Текущие и исторические значения можно получить вызовом getAxisValue() или getHistoricalAxisValue(). Количество исторических точек в событии джойстика можете узнать вызовом getHistorySize().

    Прежде чем использовать ввод с помощью джойстика, необходимо определить, находится ли джойстик в центре, а затем соответствующим образом рассчитать перемещения его оси. Джойстики обычно имеют плоскую область, то есть диапазон значений вблизи координаты (0,0), в которой ось считается центром. Если значение оси, сообщаемое Android, попадает в плоскую область, вы должны считать контроллер неподвижным (то есть неподвижным по обеим осям).

    Чтобы поддерживать игровые контроллеры с более сложными функциями, помимо одного джойстика, необходимо следовать таким рекомендациям:

    Работать со стиками с двумя контроллерами. Многие игровые контроллеры имеют как левый, так и правый джойстик.

    Для левого джойстика Android сообщает о горизонтальных перемещениях как о событиях AXIS_X, а о вертикальных перемещениях — как о событиях AXIS_Y.

    Для правого джойстика Android сообщает о горизонтальных перемещениях как о событиях AXIS_Z, а о вертикальных перемещениях — как о событиях AXIS_RZ. Удостовериться, что обрабатываются оба джойстика контроллера.

    Обрабатывать нажатия триггера плеча (но предоставлять альтернативные методы ввода). Некоторые контроллеры имеют триггеры для левого и правого плеча. Если эти триггеры присутствуют, Android сообщает о нажатии левого триггера как о событии AXIS_LTRIGGER, а о нажатии правого триггера как о событии AXIS_RTRIGGER .