DirectX C ++ Xbox контроллер ввода проблема

Итак, я начал использовать DirectX C ++, и у меня есть базовая игра с кучей астероидов, которые можно снимать с помощью мыши. У этого также есть оттянутый спрайт перекрестия, который следует за местоположением мышей.

Я решил, что хотел бы изменить ввод для поддержки контроллеров Xbox 360. Мне удалось запрограммировать кнопку съемки на кнопку A на геймпаде, однако у меня возникли некоторые проблемы, связанные с перемещением перекрестия от мыши к аналоговым джойстикам на контроллере.

Ниже приведен код, который используется для определения местоположения мышей и получения их местоположения для использования:

    virtual void Update()
{
POINT mousePosition;
D3DXVECTOR3 position, currentPosition;
DirectInput::Get().ProcessMouse();
mousePosition = DirectInput::Get().GetCurrentMousePosition();
position.x = (float) mousePosition.x;
position.y = (float) mousePosition.y;
position.z = 0.0f;
currentPosition = m_pCrossHairs->GetSpritePosition();
position.x -= currentPosition.x;
position.y -= currentPosition.y;
position.x = position.x/2.0f;
position.y = position.y/2.0f;
m_pCrossHairs->SetTranslationMatrix(position);
m_pCrossHairs->CheckBoundary();
m_pCrossHairs->Update();
}

И вот что я изменил для использования с контроллером Xbox:

    virtual void Update()
{
POINT crosshairPosition;
D3DXVECTOR3 position, currentPosition;
crosshairPosition.x = XBox360Controller::Get().RightJoyStickX();
crosshairPosition.y =- XBox360Controller::Get().RightJoyStickY();
position.x = crosshairPosition.x;
position.y = crosshairPosition.y;
position.z = 0.0f;
currentPosition = m_pCrossHairs->GetSpritePosition();
position.x -= currentPosition.x;
position.y -= currentPosition.y;
position.x = position.x/2.0f;
position.y = position.y/2.0f;
m_pCrossHairs->SetTranslationMatrix(position);
m_pCrossHairs->CheckBoundary();
m_pCrossHairs->Update();
}

На положительной ноте, что я сделал вид работ. Перекрестие действительно перемещается, когда я перемещаю аналоговый джойстик, однако он застрял в верхнем правом углу и может двигаться только в пределах примерно 1 квадратного дюйма на экране. Я немного застрял в том, почему это так и, следовательно, был бы признателен за любой вклад. Извините, если мне не хватает какой-либо важной информации, которую я, возможно, пропустил, однако немного поздней публикации, однако, очень хотелось бы, чтобы она работала!

С другой стороны — я получаю сообщение об ошибке, предупреждающее о конвертации из long в float или что-то в этом роде (следует ли мне беспокоиться об этом)?

        crosshairPosition.x = XBox360Controller::Get().RightJoyStickX();
crosshairPosition.y =- XBox360Controller::Get().RightJoyStickY();

Еще раз спасибо заранее.
Билли

Редактировать:

Код для XBox360Controller :: Get ().

XBox360Controller& XBox360Controller::Get()
{
if (s_pXBox360Controller == NULL)
s_pXBox360Controller = new XBox360Controller();
return *s_pXBox360Controller;
}

Код для правой аналоговой ручки X-Axis

float XBox360Controller::RightJoyStickX()
{
float joyStickX = GetState().Gamepad.sThumbRX;
// Make sure there has been movement, as joystick does return different values even if no movement.
if ( joyStickX< XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE &&
joyStickX > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE)
return 0;
else
return joyStickX/DynamicRange;
}

Код для правой аналоговой ручки Y-Axis

float XBox360Controller::RightJoyStickY()
{
float joyStickY = GetState().Gamepad.sThumbRY;
// Make sure there has been movement, as joystick does return different values even if no movement.
if ( joyStickY< XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE &&
joyStickY > -XINPUT_GAMEPAD_RIGHT_THUMB_DEADZONE)
return 0;
else
return joyStickY/DynamicRange;
}

РЕДАКТИРОВАТЬ РЕШЕНО:

Добавлена ​​новая матрица перевода, и она исправила проблему, спасибо за помощь.

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]