Я использую Xinput API, но у меня возникли проблемы со следующим фрагментом кода. Мое предположение состоит в том, что определения R / LX и R / LY, должны динамически меняться при вызове их снова и снова, но значение для положения ручки большого пальца произвольно устанавливается на -13108, поэтому нормализованная величина X и Y составляет -707, а нормализованная величина составляет ~ 0,428. Я продолжаю пытаться переместить ручку управления, но значения не изменятся. Есть идеи? Я неправильно понимаю API 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;
}
}
Вы нормализовали состояние, и оно довольно пустое. Я бы предположил, что вы по крайней мере вызываете XInputGetState () в своей функции bool bConnected, однако это, вероятно, будет вызвано один раз, и, следовательно, значения останутся прежними. Поэтому либо в вашей основной, либо в связанной с ней функции, показанной выше, вы должны вызывать функцию getstate один раз, первую строку в цикле while, чтобы во время выполнения состояние постоянно обновлялось.
Других решений пока нет …