C++ Xbox控制器使用Xinput时,两个拇指棒不改变值

C++ Xbox控制器使用Xinput时,两个拇指棒不改变值,c++,xinput,C++,Xinput,我使用的是xinputapi,但是下面的代码有问题。我的假设是,R/LX和R/LY的定义应该随着其不断调用而动态变化,但拇指棒位置的值被任意设置为-13108,因此X和Y的归一化幅值为-0.707,归一化幅值为~.428。我一直试图移动控制杆,但数值不会改变。有什么想法吗?我是否误解了Xinput API?结构控制器状态有意义吗?下面的代码仅适用于左斗杆,但右斗杆非常相似 #define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE 7849 #define XINPU

我使用的是xinputapi,但是下面的代码有问题。我的假设是,R/LX和R/LY的定义应该随着其不断调用而动态变化,但拇指棒位置的值被任意设置为-13108,因此X和Y的归一化幅值为-0.707,归一化幅值为~.428。我一直试图移动控制杆,但数值不会改变。有什么想法吗?我是否误解了Xinput API?结构控制器状态有意义吗?下面的代码仅适用于左斗杆,但右斗杆非常相似

#define XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE  7849
#define XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE 8689
#define XINPUT_GAMEPAD_TRIGGER_THRESHOLD    30
struct CONTROLLER_STATE
    {
        XINPUT_STATE state;
        bool bConnected;
    };
    CONTROLLER_STATE g_Controllers[4];

    while(1)
  {
            //...
            XINPUT_STATE state = g_Controllers[1].state;


            float LX = state.Gamepad.sThumbLX;
            float LY = state.Gamepad.sThumbLY;

            //determine how far the controller is pushed
            float magnitude = sqrt(LX*LX + LY*LY);

            //determine the direction the controller is pushed
            float normalizedLX = LX / magnitude;
            float normalizedLY = LY / magnitude;
            cout << " Y " << LY << endl;
            float normalizedMagnitude = 0;

            //check if the controller is outside a circular dead zone
            if (magnitude >  XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE)
            {
                //clip the magnitude at its expected maximum value
                if (magnitude > 32767) magnitude = 32767;

                //adjust magnitude relative to the end of the dead zone
                magnitude -= XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE;

                //optionally normalize the magnitude with respect to its expected range
                //giving a magnitude value of 0.0 to 1.0
                normalizedMagnitude = magnitude / (32767 - XINPUT_GAMEPAD_LEFT_THUMB_DEADZONE);
                cout << "normalizedMagnitude " << normalizedMagnitude;

            }
            else //if the controller is in the deadzone zero out the magnitude
            {
                magnitude = 0.0;
                normalizedMagnitude = 0.0;
            }
    }
#定义XINPUT_GAMEPAD_LEFT_THUMB_死区7849
#定义XINPUT_GAMEPAD_RIGHT_THUMB_死区8689
#定义XINPUT\u GAMEPAD\u触发器\u阈值30
结构控制器状态
{
新普图州;
布尔b连通;
};
控制器状态g控制器[4];
而(1)
{
//...
XINPUT_STATE STATE=g_控制器[1]。状态;
float LX=state.Gamepad.sThumbLX;
float LY=state.Gamepad.sThumbLY;
//确定控制器被推多远
浮动幅度=sqrt(LX*LX+LY*LY);
//确定推动控制器的方向
浮点归一化LX=LX/量级;
标准化浮动=LY/量级;

您可以将一个状态正常化,它相当空。我假设您至少调用了XInputGetState()然而,在bool函数bConnected中,该函数可能会被调用一次,因此值将保持不变。因此,无论是在main函数中,还是在上面显示的关联函数中,您都应该在while循环的第一行调用getstate函数一次,以便在它运行时,状态会不断更新。

您已经将我假设您至少正在调用XInputGetState()然而,在bool函数bConnected中,该函数可能会被调用一次,因此值将保持不变。因此,无论是在main中,还是在上面显示的关联函数中,您都应该调用一次getstate函数,即while循环的第一行,这样当它运行时,状态会不断更新。

控制器是否可以问题?您发布的代码没有显示正在读取控制器。但最可能出现错误的地方是XInputGetState()附近的代码。(您正在调用XInputGetState,不是吗?)控制器可能是问题所在吗?您发布的代码没有显示正在读取控制器。但最可能出现错误的地方是XInputGetState()附近的代码。(您正在调用XInputGetState,不是吗?)