C # DirectInput - определение типа контроллера геймпада - PullRequest
2 голосов
/ 14 июля 2010

Я пытаюсь использовать различные контроллеры геймпада в своем приложении, используя DirectInput API.Из того, что я могу сказать, оси по-разному отображаются между устройствами.

Существует ли общепринятый метод определения типа контроллера, отличающийся от использования DeviceInformation.ProductName / InstanceName для различения между контроллерами, чтобы обеспечить различное назначение управления осями?

1 Ответ

0 голосов
/ 23 августа 2010

Если вам просто нужно знать тип контроллера (FirstPerson, Joystick, Gamepad, ...), используйте DeviceInformation.DeviceType.

Чтобы узнать, какой конкретный контроллер подключен, используйте ProductName или лучше ProductGuid. ProductName может быть одинаковым для двух разных контроллеров. С другой стороны, ProductGuid может отличаться даже для двух контроллеров с одинаковой производственной нагрузкой.

Только с помощью ProductGuid вы можете без сомнения идентифицировать подключенный экземпляр устройства.

Кто-то может испытать желание перейти через dev.GetObjects(DeviceObjectTypeFlags.Axis) и проверить имена осей (и смещения), но нет гарантии, что ось с именем «Ось X» действительно отображается на someDevice.CurrentJoystickState.X.

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

Учтите также, что для получения этой базовой информации (как ProductGuid) вам не нужно создавать устройство. Эти свойства уже доступны в DeviceInstance (в DeviceList из Microsoft.DirectX.DirectInput.Manager.GetDevices ()) ...


Обновление: Поскольку мой собственный ответ не давал мне покоя, я углубился в тему.
Итак, вот способ определить, какие оси сопоставлять с какими значениями:

// loop through the axes of an acquired device:
foreach (DeviceObjectInstance doi in 
    _currentDevice.GetObjects(DeviceObjectTypeFlags.Axis))
{
    doi.Name; // the name of the axis, e.g. 'X-Achse' (that's a german device...)
    doi.Offset / 4; // the enumeration 'index' of the axis
    doi.UsagePage; // the UsagePage determines the context of the axis value
    // vvvv
    doi.Usage; // the Usage tells you which JoystickState field to map to.
    // ^^^^
}

До настоящего времени я нашел следующие представления значений использования:

(with JoystickState s = _currentDevice.CurrentJoystickState)
  Usage   Axis value
   48      s.X
   49      s.Y
   50      s.Z
   51      s.Rx
   52      s.Ry
   53      s.Rz
   54      s.GetSlider()[0]

Таким образом, используя switch(doi.Usage), вы можете автоматически получить соответствующее значение оси.

...