C ++ Directx мышь вводит странные действия после потери фокуса

Здравствуйте, у меня небольшая проблема с вводом мышью после потери фокуса окна (alt + tab / windows key).

После возвращения фокуса к окну игры мышь (рыскание) работает медленно и не реагирует (по некоторым причинам высота звука работает нормально). Иногда он движется, а иногда вообще не движется.

Вот часть кода:

bool Game::initDirectInput(HINSTANCE hInstance)
{
hr = DirectInput8Create(hInstance, DIRECTINPUT_VERSION, IID_IDirectInput8, (void**)&directInput, NULL);

hr = directInput->CreateDevice(GUID_SysKeyboard, &DIKeyboard, NULL);

hr = directInput->CreateDevice(GUID_SysMouse, &DIMouse, NULL);

hr = DIKeyboard->SetDataFormat(&c_dfDIKeyboard);
hr = DIKeyboard->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_NONEXCLUSIVE);

hr = DIMouse->SetDataFormat(&c_dfDIMouse2);
hr = DIMouse->SetCooperativeLevel(hWnd, DISCL_FOREGROUND | DISCL_EXCLUSIVE | DISCL_NOWINKEY);

return true;
}

void Game::detectInput(double delta)
{
DIMOUSESTATE2 mouseCurrState;

BYTE keyboardState[256];

DIKeyboard->Acquire();
DIMouse->Acquire();

DIMouse->GetDeviceState(sizeof(DIMOUSESTATE2), &mouseCurrState);

DIKeyboard->GetDeviceState(sizeof(keyboardState),(LPVOID)&keyboardState);

camera.detectInput(delta, &keyboardState[0], &mouseCurrState);
}

void Camera::detectInput(double delta, BYTE *keyboardState, DIMOUSESTATE2 *mouseCurrState){

float speed = 16.0f * delta;...if((mouseCurrState->lX != mouseLastState.lX) || (mouseCurrState->lY != mouseLastState.lY))
{
camYaw += mouseCurrState->lX * 0.002f;

camPitch += mouseCurrState->lY * 0.002f;

if(camPitch > 0.85f)
camPitch = 0.85f;
if(camPitch < -0.85f)
camPitch = -0.85f;

mouseLastState = *mouseCurrState;
}

update();

return;
}

void Camera::update(){
camRotationMatrix = XMMatrixRotationRollPitchYaw(camPitch, camYaw, 0);
camTarget = XMVector3TransformCoord(DefaultForward, camRotationMatrix );
camTarget = XMVector3Normalize(camTarget);

XMMATRIX RotateYTempMatrix;
RotateYTempMatrix = XMMatrixRotationY(camYaw);

camRight = XMVector3TransformCoord(DefaultRight, RotateYTempMatrix);
camForward = XMVector3TransformCoord(DefaultForward, RotateYTempMatrix);
camUp = XMVector3Cross(camForward, camRight);

camPosition += moveLeftRight*camRight;
camPosition += moveBackForward*camForward;
camPosition += moveUpDown*DefaultUp;

moveLeftRight = 0.0f;
moveBackForward = 0.0f;
moveUpDown = 0.0f;

camTarget = camPosition + camTarget;

camView = XMMatrixLookAtLH( camPosition, camTarget, camUp );
}

Для тех, кто интересуется, я только начал изучать c ++ и directx, используя этот учебник: http://www.braynzarsoft.net/index.php?p=DX11Lessons
(Хотя у меня есть некоторый опыт использования OpenGL + Java.)

1

Решение

Я исправил проблему, добавив простой оператор if:

if(mouseLastState.lX > -10000 && mouseLastState.lX < 10000){
camYaw += mouseLastState.lX * 0.002f;
}

Проблема заключалась в том, что когда окно вернуло фокус, оно вернуло бы такое высокое значение, что рыскание больше не действовало.

0

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector