我使用 DirectInput 来处理输入设备,我枚举每个设备上的设备和元素。
在我的游戏手柄上使用模拟摇杆时,它们会报告 0-65535 范围内的值。所有类型的绝对轴都是这种情况吗?
如果不是:有没有办法找出 DX8 输入元素的 DIDEVICEOBJECTDATA::dwData 的范围(用 DIDFT_ABSAXIS 枚举)?我能想到的唯一其他选择是在我的应用程序中使用一些自制的内部校准,这听起来太 80 年代是真的。
我使用 DirectInput 来处理输入设备,我枚举每个设备上的设备和元素。
在我的游戏手柄上使用模拟摇杆时,它们会报告 0-65535 范围内的值。所有类型的绝对轴都是这种情况吗?
如果不是:有没有办法找出 DX8 输入元素的 DIDEVICEOBJECTDATA::dwData 的范围(用 DIDFT_ABSAXIS 枚举)?我能想到的唯一其他选择是在我的应用程序中使用一些自制的内部校准,这听起来太 80 年代是真的。
您不能使用 GetProperty 获取范围并传入要填充的适当 DIPROPRANGE 结构吗?使用 DIPROP_RANGE GUID。
正如 Goz 所说的那样,我做了以下工作:
dev->EnumObjects(EnumElementsCallback, 0, DIDFT_ALL); BOOL CALLBACK EnumElementsCallback(LPCDIDEVICEOBJECTINSTANCE dev, LPVOID) { if ((dev->dwType & DIDFT_ABSAXIS) != 0) { DIPROPRANGE 范围; range.diph.dwSize = sizeof(DIPROPRANGE); range.diph.dwHeaderSize = sizeof(DIPROPHEADER); range.diph.dwHow = DIPH_BYID; range.diph.dwObj = dev->dwType; if (lDevice->mDIDevice->GetProperty(DIPROP_RANGE, &range.diph) == DI_OK) { ... = 范围.lMin; ... = 范围.lMax; } } }
来自: http: //www.wingmanteam.com/files/Tools/DXTweak/Readme.txt
游戏控制器驱动程序通常将轴位置信息作为 0 到 655 之间的整数值报告给 DirectInput。DirectInput 将这些值线性缩放到 0 到 65535。