company_banner

Xbox One геймпад для игр на PC

    Многим любителям компьютерных игр хорошо знаком контролер 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          0x0001
    #define XINPUT_GAMEPAD_DPAD_DOWN        0x0002
    #define XINPUT_GAMEPAD_DPAD_LEFT        0x0004
    #define XINPUT_GAMEPAD_DPAD_RIGHT       0x0008
    #define XINPUT_GAMEPAD_START            0x0010
    #define XINPUT_GAMEPAD_BACK             0x0020
    #define XINPUT_GAMEPAD_LEFT_THUMB       0x0040
    #define XINPUT_GAMEPAD_RIGHT_THUMB      0x0080
    #define XINPUT_GAMEPAD_LEFT_SHOULDER    0x0100
    #define XINPUT_GAMEPAD_RIGHT_SHOULDER   0x0200
    #define XINPUT_GAMEPAD_A                0x1000
    #define XINPUT_GAMEPAD_B                0x2000
    #define XINPUT_GAMEPAD_X                0x4000
    #define XINPUT_GAMEPAD_Y                0x8000
    


    Чуть сложнее обстоит дело с значениями курков и двух джойстиков. Значения осей 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:

    <!DOCTYPE html>
    <html>
    <head>
      <title>Gamepad API Sample</title>
      <meta http-equiv="X-UA-Compatible" content="IE=Edge">
      <script>
        function gameLoop() {
          var gamepads = navigator.getGamepads();
          for (var playerIndex = 0; playerIndex < gamepads.length; playerIndex++) {
            var gamepad = gamepads[playerIndex];
            if (gamepad) {
              if (gamepad.buttons[6].pressed || gamepad.buttons[7].pressed) {
                // A trigger is pressed, fire weapon.
                fireWeapon(playerIndex);
              }
            }
          }
    
          window.requestAnimationFrame(gameLoop);
        }
        gameLoop();
      </script>
    </head>
    <body>
    
    


    Если вы хотите внедрить поддержку геймпада в игру на 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 – обязательно подключите поддержку геймпадов, эта возможность придется по вкусу многим игрокам.

    Полезные ссылки


    Microsoft
    Microsoft — мировой лидер в области ПО и ИТ-услуг

    Comments 30

      +3
      image

      Игре? Xbox One? Игре? Простите, что? Может быть вы имели ввиду «Используем геймпад Xbox One при игре на ПК»?

      Нет? Уточните, а то мой мозг сломан.
        +8
        Ок, поменял.
          –5
          «Xbox One геймпад» — бессмысленный набор слов. Нельзя в русском языке использовать существительное как прилагательное. Можно состряпать составное слово, например, «Windows-программа». Но в данном случае «геймпад» относится сразу к двум словам, и придётся писать через тире: «Xbox 360 — геймпад». Это будет правильно, но всё равно так же косноязычно. Так что лучше напишите: «геймпад [консоли] Xbox One».
          Это так, к слову пришлось.
        +1
        А у меня GNU/Linux, это вроде тоже ПК?
        На нём работать будет без особых телодвижений? А то все нахваливают, очень хочется купить, попробовать.
        Вот бы ещё статью хорошую написали, а то как-то про другие ОС всегда забывают.
          +27
          Конечно GNU/Linux тоже ПК. Xbox One контроллер будет работать без телодвижений с ядром > 3.17. Описание API находится по этому адресу www.kernel.org/doc/Documentation/input/joystick-api.txt, там тоже все достаточно просто.
            +8
            Респект вам за такой ответ. :)
              +1
              Спасибо большое! Будем пробовать!
                0
                Для Xbox 360 под мак были неофициальные драйвера. Есть ли способ подключить новый контроллер?
                0
                А на Mac os x как с этим дела обстоят?
                  +4
                  Написал выше. В общем на Mac тоже работает в том числе в Yosemite. Но я эти драйвера не видел, и не знаю, работает ли там вибро, например. Я уж не говорю про гарнитуру. Как джойстик, наверняка там все в порядке.
                +7
                С приходом нового CEO многое изменилось теперь Microsoft «сердечко» Linux :)
                P.S. Поддержкой кода для работы Xbox-геймпада в ядре Linux занимается Valve
                0
                Сам геймпад есть, а беспроводной передатчик к компу? Я так понимаю что онный от 360 не подойдет.
                  +2
                  Пока можно подключиться только по проводу.
                    +1
                    По-этому, информация про батарейки не интересна для PC пользователей.
                  0
                  Что еще могу добавить про сам контроллер:
                  Плюсы: Игры затачиваются именно под контроллеры от Майков.
                  Минусы: XO контроллер собран не очень. Детали корпуса скрипят в руках. Вибраторы иногда начинают дребезжать, как будто плохо закрепленны.
                  До этого был китайский аналог PS3 контроллера, он конечно совсем не очень, но и стоит копейки. По-этому купил XO контроллер сразу после выхода приставки и стал ждать драйверов. Но никак не ожидал от родного контроллера таких проблем со сборкой.
                    0
                    Вы уверены, что не подделку купили?
                    У меня два таких контроллера фирменных. Регулярно их кооперативно мучаем и пока никаких претензий. Все четко, без дребезжаний и скрипов.
                    Но я покупал именно в магазине партнере МС и уверен, что контроллеры не подделка.
                      0
                      Покупал у Майков на амазоне (http://www.amazon.co.uk/gp/product/B00CM1KUHS).
                      Думаете, они могли обмануть? :)
                        +1
                        Без понятия. Просто мой опыт противоречит вашему, о чем и решил сообщить. :)
                          0
                          Могли, но маловероятно. Я несколько раз покупал разные контроллеры на Amazon'е. Обычно в первое время продаются только оригинальные, а через года два-три могут встречаться и подделки (но надо отдать должное: Amazon их забирает обратно «без звука»).

                          Сейчас XBox One — всё-таки ещё довольно молод, вряд ли они успели навезти китая.
                          +1
                          Прошу прощения, покупал у Амазона (Sold by: Amazon EU S.a.r.L.)
                            0
                            новые контролеры действительно сделаны похабно по сравнению с версией от 360-го.
                            0
                            Думал что какой-то косяк из-за того что шифты болтаются. Но после 6 часового забега в Destiny — однозначно лучше чем от 360))) Очень удобно оказалось, что люфт позволяет менять положение пальцев в районе курков.
                            0
                            крестовину победили?
                              +2
                              А что с ней не так?
                                0
                                у Xbox 360 крестовина деревянная (причём это не брак конкретно моего геймпада, все знакомые отмечали, что у какого-нибудь Logitech Fxxx она не в пример отзывчивей)
                                  +1
                                  Не замечал. Хотя знаю пару людей, у которых плохо получается ей пользоваться. Я то думал они просто криворукие. :)
                              0
                              Оффтопик: Я наверное задам нубский вопрос (не особо игрок), ответьте пожалуйста, кто знает.

                              Геймпад Xbox One или от Xbox 360 обеспечит плавный поворот колес при управлении машинами в играх (GTA 4, в будущем GTA 5) и плавный газ/торможение?

                              Или надо покупать руль с педалями?

                              Спасибо!

                              P.S. судя по описанию структур данных (хорошо быть разработчиком :D), «курки» передают 0-255 значений (газ/тормоз?), + много вариантов у «джойстиков» (поворот руля?)
                                0
                                Отвечу сам себе, геймпад отличный, управление автомобилем в гта4 плавное (повороты руля, газ/тормоз)

                              Only users with full accounts can post comments. Log in, please.