Подключаем к игре Xbox One геймпад
Многим любителям компьютерных игр хорошо знаком контролер Xbox 360. Это заслуженный «ветеран», который имеет значительную армию поклонников. Его можно подключить к компьютеру с помощью шнура или беспроводного адаптера, и многие игроки предпочитают играть с помощью него в игры на PC. Обновленная версия для Xbox Оne тоже может быть подключена к PC через микро-USB разъём, а также имеет ряд улучшений, которые придутся по вкусу игрокам. Для этого контроллера уже выпущены драйвера для Windows 8 и Windows 7 и они совместимы с API XInput. Приложения, которые рассчитаны на работу с геймпадами будут сразу способны работать с новым контроллером.Контроллер Xbox 360 зарекомендовал себя как добротный и качественный продукт, который долго служит, лишен каких-то фатальных недостатков. Наблюдается устойчивый рост продаж этих контроллеров, а также количество игр, в которые можно играть с помощью этого устройства.
Что нового? Обновленная версия для Xbox One вобрала в себя все самое лучшее что было в Xbox 360 контроллере, он стал более удобным. Немного изменилась форма, теперь контроллер лучше «сидит» в руках. Многие так же отметят отсутствие отсека для батарей. Теперь задник контроллера не имеет этого выступа.Тем не менее, этот контроллер использует для питания обыкновенные батарейки AA или аккумуляторы аналогичного размера. Так же следует отметить отсутствие отверстий под шурупы, улучшенную чувствительность DPAD и джойстиков, новые вибромоторы в курках. Есть и «невидимые» изменения, коснувшиеся беспроводного протокола работы. Xbox 360 контроллер работал на скорости около 1.6 мегабита в секунду В новой версии пропускная способность возросла более чем в 20 раз, что позволяет расширить возможности подключаемых аксессуаров. Одним из таких устройств может быть стерео гарнитура: API Основным методом работы с геймпадом в ОС Windows является использование С++ API XInput. Следует отметить отсутствие инициализирующих функций, вы просто опрашиваете состояние контроллера: XINPUT_STATE state; DWORD result=XInputGetState (0, &state);
if (result == ERROR_SUCCESS) { if (state.Gamepad.wButtons & XINPUT_GAMEPAD_A) { //нажата кнопка A } } Функция XInputGetState принимает в качестве параметров индекс контроллера (их может быть подключено несколько), а так же структуру с состоянием куда возвращаются значения кнопок:
typedef struct _XINPUT_STATE { DWORD dwPacketNumber; //порядковый номер пакета XINPUT_GAMEPAD Gamepad; } XINPUT_STATE, *PXINPUT_STATE;
typedef struct _XINPUT_GAMEPAD { WORD wButtons; BYTE bLeftTrigger; BYTE bRightTrigger; SHORT sThumbLX; SHORT sThumbLY; SHORT sThumbRX; SHORT sThumbRY; } XINPUT_GAMEPAD, *PXINPUT_GAMEPAD;
Кнопки закодированы битами:
#define XINPUT_GAMEPAD_DPAD_UP 0×0001 #define XINPUT_GAMEPAD_DPAD_DOWN 0×0002 #define XINPUT_GAMEPAD_DPAD_LEFT 0×0004 #define XINPUT_GAMEPAD_DPAD_RIGHT 0×0008 #define XINPUT_GAMEPAD_START 0×0010 #define XINPUT_GAMEPAD_BACK 0×0020 #define XINPUT_GAMEPAD_LEFT_THUMB 0×0040 #define XINPUT_GAMEPAD_RIGHT_THUMB 0×0080 #define XINPUT_GAMEPAD_LEFT_SHOULDER 0×0100 #define XINPUT_GAMEPAD_RIGHT_SHOULDER 0×0200 #define XINPUT_GAMEPAD_A 0×1000 #define XINPUT_GAMEPAD_B 0×2000 #define XINPUT_GAMEPAD_X 0×4000 #define XINPUT_GAMEPAD_Y 0×8000 Чуть сложнее обстоит дело с значениями курков и двух джойстиков. Значения осей X, Y находятся в пределах SHRT_MIN-SHRT_MAX (-32768 +32767), а для курков _UI8_MAX (255). Обычно в играх эти значения нормализуют до -1.0 +1.0. Также для джойстиков следует учитывать так называемый dead zone. Возвращаемые значения осей при нейтральном положении могут отличаться от нуля, и для того чтобы не учитывать их следует использовать стандартные значения «мертвой зоны», вычислять которую следует по следующему алгоритму:
float magnitude = sqrt (state.Gamepad.sThumbRX*state.Gamepad.sThumbRX + state.Gamepad.sThumbRY*state.Gamepad.sThumbRY);
if (magnitude > XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE) { //джойстик действительно сдвинули с места } Стандартные значения этих пороговых значений имеют следующий вид:
#define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE 7849 #define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689 #define XINPUT_GAMEPAD_TRIGGER_THRESHOLD 30 Вы можете посмотреть на более подробные примеры работы с геймпадом на сайте code.msdn.com, а так же воспользоваться оберткой которая входит в DirectX Toolkit.Помимо функций непосредственно связанных с опросом состояний контроллера, в XInput так же входят функции управления вибромоторами и подключаемыми аксессуарами, например для записи голоса с гарнитуры или воспроизведения звука на гарнитуру.
Поддержка джойстика так же есть для управляемого кода в библиотеке XNA и Monogame. В Internet Explorer Developer Channel вошла экспериментальная реализация W3C Gamepad API и вы можете использовать ваш контроллер для создания игр на HTML/Javasctipt как для веб так и для приложений Windows 8:
Если вы хотите внедрить поддержку геймпада в игру на HTML5 для Windows 8 уже сейчас, не дожидаясь выхода в свет следующей версии Internet Explorer, то вы можете воспользоваться оберткой над XInput для Javasctipt.
Поддержка геймпада так же есть и в Unity3d. Класс Input содержит все необходимые методы для работы с состояниями контроллера:
using UnityEngine; using System.Collections;
public class NewBehaviourScript: MonoBehaviour { void Start () { } void Update () { var axisX = Input.GetAxis («Horisontal»); if (Input.GetButtonDown («A Btn»)) { //нажата кнопка A } } }
Только не забудьте сконфигурировать корректные названия для кнопок и джойстиков (Edit/Project Settings/Input): Из приведенных примеров очевидно, что работа с геймпадом очень проста и не требует сверхсложных усилий. Если вы разрабатываете игру для Windows 8 с помощью C++, C#, Unity или HTML — обязательно подключите поддержку геймпадов, эта возможность придется по вкусу многим игрокам.