C# DirectInput - 确定游戏手柄控制器类型
Posted
技术标签:
【中文标题】C# DirectInput - 确定游戏手柄控制器类型【英文标题】:C# DirectInput - Determining a gamepad controller type 【发布时间】:2010-07-14 12:42:12 【问题描述】:我正在尝试使用 DirectInput API 在我的应用程序中使用各种游戏手柄控制器。据我所知,轴在设备之间的映射方式不同。
除了使用 DeviceInformation.ProductName/InstanceName 来区分控制器以允许不同的轴控制分配之外,是否有一种常用的方法来确定控制器类型?
【问题讨论】:
【参考方案1】:如果您只需要知道控制器类型(FirstPerson、Joystick、Gamepad...),请使用 DeviceInformation.DeviceType。
要知道连接了哪个特定控制器,请使用 ProductName 或更好的 ProductGuid。对于两个不同的控制器,ProductName 可能相同。另一方面,即使对于相同生产费用的两个控制器,ProductGuid 也可能不同。
只有使用 ProductGuid,您才能毫无疑问地识别连接的设备实例。
人们可能会想通过dev.GetObjects(DeviceObjectTypeFlags.Axis)
查找并检查轴的名称(和偏移量),但不能保证名为“X 轴”的轴确实映射到someDevice.CurrentJoystickState.X
。
您要么必须自己为将要连接的任何控制器预先完成所有映射(只有在您自己开发应用程序时才可接受)并将该信息存储在应用程序的配置文件中,否则您将需要提供某种形式,用户可以自己映射新设备。我目前正在开发这个,但这个答案会超出这个问题的范围......
还请考虑,为了获取此基本信息(如 ProductGuid),您不必创建设备。这些属性已在 DeviceInstance 中可用(在 Microsoft.DirectX.DirectInput.Manager.GetDevices() 的 DeviceList 中)...
更新:因为我自己的回答一直困扰着我,所以我更深入地探讨了这个话题。 所以这里有一种方法来确定哪些轴映射到哪些值:
// 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)
可以自动获取对应的轴值。
【讨论】:
从 Usage 到 DirectInput 轴的完整映射在此站点上:msdn.microsoft.com/en-us/windows/hardware/gg487464.aspx。另外,doi.Guid
直接包含目标映射。
这些使用代码来自 USB 使用表:有关详细信息,请参阅 usb.org/developers/devclass_docs/Hut1_12v2.pdf。如果您正在编写飞行模拟程序、锻炼机软件或想要支持光枪、头部跟踪器或手套等外来输入,这些将派上用场。以上是关于C# DirectInput - 确定游戏手柄控制器类型的主要内容,如果未能解决你的问题,请参考以下文章