【问题标题】:How do i access joystick digital pad in DirectInput8?如何在 DirectInput8 中访问操纵杆数字键盘?
【发布时间】:2021-10-17 13:50:59
【问题描述】:

一直在寻找和搜索,我找不到如何在 Dinput8 中访问操纵杆 D-Pad。 我们有 DIJOYSTATE2 结构来获取其信息,但不知道该选择什么。 我知道 rgb_butoons[] 数组保存按钮信息,而 lXlY 是模拟摇杆。

还是不知道方向键(十字)

【问题讨论】:

    标签: c++ directinput


    【解决方案1】:

    我相信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,否则|= 运算符会与垃圾结合(正式未定义的行为)
    • 干杯。从我自己的一个项目中简化了这个 sn-p,从未测试过它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多