所以我已经开始使用 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 轴的代码
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;
}
编辑解决:
添加了一个新的翻译矩阵,它解决了这个问题,感谢您的帮助。