Эта статья предназначена для новичков в XNA и расскажет о том, как написать код, который может обрабатывать информацию о стандартном USB совместимом геймпаде используя некоторые библиотеки Nuclex.
Назвать его просто игровым движком, все равно, что машину колесом. Он состоит из множества компонентов, которые как говорят его разработчики, призваны уменьшить нагрузку на написание кода, а также выбрасывают нулевое количество мусора.
Теперь ближе к сути вопроса.
В этой статейке расскажу о самом простом способе решить проблемы зависимости XNA от Xbox — контроллеров. Возможно, что со временем эту проблму уберут, ну а пока вот простой метод.
Первым делом нужно скачать компоненты, которые отвечают за геймпады. Все они вложены в общую папку с остальными частями Nuclexp.
Нам нужны следующие компоненты:
SlimDX.DirectInput.dll
Nuclex.Input.dll
Чтобы добавить их к игре, можно их просто скопировать в папку с кодом, перетащить на панель Обозревателя Решений ( Solution Explorer ), или добавить ссылку путем Проект (Project) -> Добавить ссылку ... (Add Reference). Главное — чтобы компоненты находились там же, где и исполняемый файл. После добавления, добавляем ссылки на нужные нам службы, а точнее основные: Nuclex.Input, SlimDX
И наконец программирование:
В главном классе игры (Game1) подключаем службы:
1
2
usingNuclex.Input;usingSlimDX;
Создаем переменные:
1
InputManager NuclexInputManager;
Теперь нужно заполнить наш указатель на службу и добавить компонент, делается это в инициализации класса:
Теперь осталось лишь применить компонент, но перед этим некоторые особенности Nuclex-Input, которые следует учесть. Подробнее о них можно прочитать в официальной документации по Nuclex.
Отличием Nuclex, скажем от Keyboard.GetState(), является индексы. Как сказано в официальной документации, она следующая: Первые 4 индекса, отвечают за стандартные средства ввода, которые совместимы и аналогичны XNA-средствам ввода, например:
1
2
3
4
5
6
GamePad.GetState(PlayerIndex.One);// но с отличием:// также возвращает состояние Xbox-геймпада.NuclexInputManager.GetGamePad(ExtendedPlayerIndex.One).Getstate();
Остальные 4 относятся к несовместимым с XNA, и как сказано !DirectInput-compatible устройствам, например стандартный USB джойстик. Эти индекса соответственно начинаются с 5,6,7,8. Т.к. Чтобы получить информацию о USB-джойтике, можно использовать:
ExtandedPlayerIndex – дословно расширенные индекс игрока. Используется чтобы получить состояние устройства, индекс которого 5,6,7 или 8. А для XNA совместимых, используется стандартный метод:
Также перед использованим Nuclex, следует отказаться от использвания стандартных методов от XNA, например: GamePad.GetState(PlayerIndex.One), используя лишь методы Nuclex-Input, дабы избежать конфликтов.
На этом разбор важных особенностей можно закончить, переходим к добиванию кода.
Узнаем, подключен ли первый (единственный) геймпад:
IsAttached() - как уже понятно, вернет True, если геймпад №1 подключен. Как было сказано, это работает, если известно, что будет подключен не XNA-стандартный геймпад.