Взгляд мыши/проблемы с вычислением дельты мышиC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Взгляд мыши/проблемы с вычислением дельты мыши

Сообщение Anonymous »

Итак, в настоящее время я пытаюсь создать систему внешнего вида мыши для игры, которую делаю. Вот мой текущий код:

Код: Выделить всё

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(&currentMousePosition);

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»