【发布时间】:2021-10-17 13:50:59
【问题描述】:
一直在寻找和搜索,我找不到如何在 Dinput8 中访问操纵杆 D-Pad。 我们有 DIJOYSTATE2 结构来获取其信息,但不知道该选择什么。 我知道 rgb_butoons[] 数组保存按钮信息,而 lX 和 lY 是模拟摇杆。
还是不知道方向键(十字)
【问题讨论】:
标签: c++ directinput
一直在寻找和搜索,我找不到如何在 Dinput8 中访问操纵杆 D-Pad。 我们有 DIJOYSTATE2 结构来获取其信息,但不知道该选择什么。 我知道 rgb_butoons[] 数组保存按钮信息,而 lX 和 lY 是模拟摇杆。
还是不知道方向键(十字)
【问题讨论】:
标签: c++ directinput
我相信rgdwPOV 是您所追求的。我假设你已经创建了你的设备,SetDataFormat(&c_dfDIJoystick2) 并获得了它。
我将 DPAD 的状态转换为 16 位 int,以便每个位表示每个 DPAD 中的 1 个方向,每个 DPAD 4 位(上、下、左、右)。
这是一个 C++ 示例:
DIJOYSTATE2 DeviceState;
HRESULT hr = DIDevice->GetDeviceState(sizeof(DIJOYSTATE2), &DeviceState);
uint16_t rgdwPOV = 0;
for (int i = 0; i < 4; i++) { // In banks of 4, shift in the sate of each DPAD 0-16 bits
switch (DeviceState.rgdwPOV[i]) {
case 0: rgdwPOV |= (byte)(1 << ((i + 1) * 0)); break; // dpad[i]/up, bit = 0
case 18000: rgdwPOV |= (byte)(1 << ((i + 1) * 1)); break; // dpad[i]/down, bit = 1
case 27000: rgdwPOV |= (byte)(1 << ((i + 1) * 2)); break; // dpad[i]/left, bit = 2
case 9000: rgdwPOV |= (byte)(1 << ((i + 1) * 3)); break; // dpad[i]/right, bit = 3
}
}
【讨论】:
rgdqPOV,否则|= 运算符会与垃圾结合(正式未定义的行为)