2016-07-19 14 views
1

Я использую API Xinput, но у меня возникают проблемы со следующим битом кода. Мое предположение заключается в том, что определение R/LX и R/LY должно динамически меняться по мере его вызова снова и снова, но значение положения палки большого пальца произвольно устанавливается на -13108, поэтому нормализованная величина X и Y - -0,70, а нормализованная величина ~ .428. Я продолжаю пытаться переместить контрольную панель, но значения не изменятся. Есть идеи? Я не понимаю Xinput API? Имеет ли смысл состояние контроллера структуры? Код ниже приведен только для левой палки, но правый палочка очень похож.Xbox Controller оба пальца не изменяют значение, используя Xinput

#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; 
      } 
    } 
+0

Может ли проблема с контроллером? – Zotto

+0

Код, который вы опубликовали, не показывает чтение контроллеров. Но наиболее вероятным местом для вашей ошибки является код около XInputGetState(). (Вы вызываете XInputGetState, не так ли?) –

ответ

0

У вас нормализовано состояние, и оно довольно пустое. Я бы предположил, что вы по крайней мере вызываете XInputGetState() в вашей функции bool bConnected, однако это, вероятно, будет вызываться один раз, и, следовательно, значения останутся неизменными. Поэтому, как в основном, так и в связанной функции, отображаемой выше, вы должны вызывать функцию getstate один раз, первая строка в цикле while, так как она выполняется, состояние постоянно обновляется.