2016-07-19 2 views
1

Ich benutze die Xinput API, aber ich habe Probleme mit dem folgenden Bit Code. Meine Annahme ist, dass die Definition von R/LX und R/LY sich dynamisch ändern sollte, wie es immer wieder aufgerufen wird, aber der Wert für die Position des Daumensticks wird willkürlich auf -13108 gesetzt, also die normalisierte Größe von X und Y ist -.707, und die normalisierte Größe ist ~ .428. Ich versuche immer den Steuerknüppel zu bewegen, aber die Werte ändern sich nicht. Irgendwelche Ideen? Missverstehe ich die Xinput API? Ist der Status des Strukturcontrollers sinnvoll? Der Code unten ist nur für den linken Stick, aber der rechte Stick ist sehr ähnlich.Xbox Controller beide Daumen-Sticks Wert nicht ändern, mit 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

Könnte der Controller das Problem sein? – Zotto

+0

Der von Ihnen gepostete Code zeigt beim Lesen der Controller nicht an. Der wahrscheinlichste Ort für Ihren Fehler ist jedoch der Code in der Nähe von XInputGetState(). (Du rufst XInputGetState an, oder?) –

Antwort

0

Sie haben einen Zustand normalisiert und er ist ziemlich leer. Ich würde annehmen, dass Sie zumindest XInputGetState() in Ihrer bool-Funktion bConnected aufrufen, dies würde jedoch wahrscheinlich einmal aufgerufen werden und somit würden die Werte gleich bleiben. Daher sollten Sie entweder in Ihrer Haupt- oder in der oben angezeigten zugeordneten Funktion die getstate-Funktion einmal in der ersten Zeile der while-Schleife aufrufen, damit der Zustand kontinuierlich aktualisiert wird.

Verwandte Themen