所以我开始使用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平方英寸的范围内移动。我有点卡住为什么会这样,因此会欣赏任何类型的输入。对不起,如果我缺少任何我可能错过的重要信息,那么一些迟到的帖子却真的很想让它发挥作用!
在旁注 - 我在下面给出了一个错误,给我一个关于从长到浮点或其他东西的转换的警告(我应该担心这个吗?)
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轴的代码
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轴的代码
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;
}
编辑已解决:
添加了新的翻译矩阵并解决了问题,感谢您的帮助。