Код: Выделить всё
class InputManager
{
public:
bool GetKey(KeyCode key, KeyState state)
{
int vkCode = static_cast(key);
short result = GetAsyncKeyState(vkCode);
switch (state)
{
case KeyState::PRESSED:
return (result & 0x8000) != 0;
case KeyState::RELEASED:
return (result & 0x0001) != 0;
}
return false;
}
bool GetMouseButton(MouseCode key, KeyState state)
{
int vkCode = static_cast(key);
short result = GetAsyncKeyState(vkCode);
switch (state)
{
case KeyState::PRESSED:
return (result & 0x8000) != 0;
case KeyState::RELEASED:
return (result & 0x0001) != 0;
}
return false;
}
Vector2i GetMousePosition()
{
POINT point;
GetCursorPos(&point);
return { point.x, point.y };
}
Vector2i GetMouseDelta()
{
static POINT lastMousePosition = { 0, 0 };
POINT currentMousePosition;
GetCursorPos(¤tMousePosition);
Vector2i delta = {};
delta.x = currentMousePosition.x - lastMousePosition.x;
delta.y = currentMousePosition.y - lastMousePosition.y;
lastMousePosition = currentMousePosition;
return delta;
}
void SetMouseMode(const MouseMode& mode)
{
ShowCursor((bool)mode);
mouseMode = mode;
}
void Update()
{
if (mouseMode == MouseMode::LOCKED && GetKey(KeyCode::ESCAPE, KeyState::PRESSED))
SetMouseMode(MouseMode::FREE);
if (mouseMode == MouseMode::LOCKED)
{
RECT rect;
GetWindowRect(GetDesktopWindow(), &rect);
int CenterX = (rect.right - rect.left) / 2;
int CenterY = (rect.bottom - rect.top) / 2;
SetCursorPos(CenterX, CenterY);
RECT lockRect = { CenterX, CenterY, CenterX, CenterY };
ClipCursor(&lockRect);
}
else
ClipCursor(NULL);
}
static InputManager& GetInstance()
{
static InputManager instance;
return instance;
}
private:
bool IsCursorInWindow()
{
POINT mousePosition;
GetCursorPos(&mousePosition);
ScreenToClient(Window::GetHandle(), &mousePosition);
RECT clientRect;
GetClientRect(Window::GetHandle(), &clientRect);
return PtInRect(&clientRect, mousePosition);
}
MouseMode mouseMode = MouseMode::FREE;
Vector2i mouseDelta = {};
Vector2i lastPosition = {};
TimePoint lastUpdate = Clock::now();
Milliseconds updateInterval{ 16 };
InputManager() = default;
InputManager(const InputManager&) = delete;
void operator=(const InputManager&) = delete;
};
Я пробовал изменить частоту обновлений, задать ChatGPT, изменить ветку обновлений, но ничего из этого не помогло.
Подробнее здесь: https://stackoverflow.com/questions/784 ... n-problems