1

Xinput API を使用していますが、次のコードで問題が発生しています。私の仮定では、R/LX と R/LY の定義は何度も呼び出されると動的に変化するはずですが、サム スティックの位置の値は任意に -13108 に設定されているため、X と Y の正規化された大きさはは -.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;
            }
    }
4

1 に答える 1

0

状態を正規化しましたが、かなり空です。bool関数bConnectedで少なくともXInputGetState()を呼び出していると思いますが、これはおそらく1回呼び出されるため、値は同じままです。したがって、メインまたは上記の関連する関数のいずれかで、getstate 関数を while ループの最初の行で 1 回呼び出す必要があります。これにより、実行時に状態が継続的に更新されます。

于 2016-08-17T03:46:54.860 に答える