diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-02 00:04:54 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-02 00:43:04 +0800 |
| commit | 47e00f7b62b0717d09504d63e9d53404250609de (patch) | |
| tree | d0024d39bea490bfca6f35df58c39f23e5d1c21d /Minecraft.Client/Windows64 | |
| parent | e16600a3e6b497f520178a7cb8be7a06b5c6efad (diff) | |
feat: improve mouse input handling
Diffstat (limited to 'Minecraft.Client/Windows64')
| -rw-r--r-- | Minecraft.Client/Windows64/KeyboardMouseInput.cpp | 23 | ||||
| -rw-r--r-- | Minecraft.Client/Windows64/KeyboardMouseInput.h | 12 | ||||
| -rw-r--r-- | Minecraft.Client/Windows64/Windows64_Minecraft.cpp | 14 |
3 files changed, 48 insertions, 1 deletions
diff --git a/Minecraft.Client/Windows64/KeyboardMouseInput.cpp b/Minecraft.Client/Windows64/KeyboardMouseInput.cpp index 791eb272..fc763394 100644 --- a/Minecraft.Client/Windows64/KeyboardMouseInput.cpp +++ b/Minecraft.Client/Windows64/KeyboardMouseInput.cpp @@ -13,6 +13,8 @@ KeyboardMouseInput::KeyboardMouseInput() , m_captured(false) , m_hWnd(NULL) , m_initialized(false) + , m_mouseX(0) + , m_mouseY(0) { memset(m_keyState, 0, sizeof(m_keyState)); memset(m_keyStatePrev, 0, sizeof(m_keyStatePrev)); @@ -20,6 +22,7 @@ KeyboardMouseInput::KeyboardMouseInput() memset(m_mouseButtonsPrev, 0, sizeof(m_mouseButtonsPrev)); memset(m_keyPressedAccum, 0, sizeof(m_keyPressedAccum)); memset(m_mousePressedAccum, 0, sizeof(m_mousePressedAccum)); + memset(m_mouseReleasedAccum, 0, sizeof(m_mouseReleasedAccum)); } KeyboardMouseInput::~KeyboardMouseInput() @@ -103,6 +106,7 @@ void KeyboardMouseInput::OnMouseButton(int button, bool down) if (button >= 0 && button < 3) { if (down && !m_mouseButtons[button]) m_mousePressedAccum[button] = true; + if (!down && m_mouseButtons[button]) m_mouseReleasedAccum[button] = true; m_mouseButtons[button] = down; } } @@ -112,12 +116,23 @@ void KeyboardMouseInput::OnMouseWheel(int delta) m_scrollDeltaAccum += delta; } +void KeyboardMouseInput::OnMouseMove(int x, int y) +{ + m_mouseX = x; + m_mouseY = y; +} + +int KeyboardMouseInput::GetMouseX() const { return m_mouseX; } +int KeyboardMouseInput::GetMouseY() const { return m_mouseY; } +HWND KeyboardMouseInput::GetHWnd() const { return m_hWnd; } + void KeyboardMouseInput::ClearAllState() { memset(m_keyState, 0, sizeof(m_keyState)); memset(m_mouseButtons, 0, sizeof(m_mouseButtons)); memset(m_keyPressedAccum, 0, sizeof(m_keyPressedAccum)); memset(m_mousePressedAccum, 0, sizeof(m_mousePressedAccum)); + memset(m_mouseReleasedAccum, 0, sizeof(m_mouseReleasedAccum)); m_mouseDeltaXAccum = 0.0f; m_mouseDeltaYAccum = 0.0f; m_scrollDeltaAccum = 0; @@ -178,6 +193,14 @@ bool KeyboardMouseInput::ConsumeMousePress(int btn) return pressed; } +bool KeyboardMouseInput::ConsumeMouseRelease(int btn) +{ + if (btn < 0 || btn >= 3) return false; + bool released = m_mouseReleasedAccum[btn]; + m_mouseReleasedAccum[btn] = false; + return released; +} + void KeyboardMouseInput::ConsumeMouseDelta(float &dx, float &dy) { dx = m_mouseDeltaXAccum; diff --git a/Minecraft.Client/Windows64/KeyboardMouseInput.h b/Minecraft.Client/Windows64/KeyboardMouseInput.h index 4d272f91..a09843f9 100644 --- a/Minecraft.Client/Windows64/KeyboardMouseInput.h +++ b/Minecraft.Client/Windows64/KeyboardMouseInput.h @@ -42,9 +42,16 @@ public: // Use these from code that runs at game tick rate (20Hz). bool ConsumeKeyPress(int vk); bool ConsumeMousePress(int btn); + bool ConsumeMouseRelease(int btn); void ConsumeMouseDelta(float &dx, float &dy); int ConsumeScrollDelta(); + // Absolute cursor position (client-area coordinates, for GUI when not captured) + void OnMouseMove(int x, int y); + int GetMouseX() const; + int GetMouseY() const; + HWND GetHWnd() const; + // Mouse capture for FPS look void SetCapture(bool capture); bool IsCaptured() const; @@ -61,6 +68,7 @@ private: // Sticky press accumulators (persist until consumed by game tick) bool m_keyPressedAccum[256]; bool m_mousePressedAccum[3]; + bool m_mouseReleasedAccum[3]; // Mouse delta accumulators (persist until consumed by game tick) float m_mouseDeltaXAccum; @@ -72,6 +80,10 @@ private: bool m_captured; HWND m_hWnd; bool m_initialized; + + // Absolute cursor position in client coordinates + int m_mouseX; + int m_mouseY; }; extern KeyboardMouseInput KMInput; diff --git a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp index 6c6cec15..931e7f17 100644 --- a/Minecraft.Client/Windows64/Windows64_Minecraft.cpp +++ b/Minecraft.Client/Windows64/Windows64_Minecraft.cpp @@ -395,6 +395,9 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) case WM_MOUSEWHEEL: KMInput.OnMouseWheel(GET_WHEEL_DELTA_WPARAM(wParam)); break; + case WM_MOUSEMOVE: + KMInput.OnMouseMove(GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam)); + break; case WM_ACTIVATE: if (LOWORD(wParam) == WA_INACTIVE) KMInput.SetCapture(false); @@ -404,6 +407,15 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) KMInput.ClearAllState(); break; + case WM_SETCURSOR: + // Hide the OS cursor when an Iggy/Flash menu is displayed (it has its own Flash cursor) + if (LOWORD(lParam) == HTCLIENT && !KMInput.IsCaptured() && ui.GetMenuDisplayed(0)) + { + SetCursor(NULL); + return TRUE; + } + return DefWindowProc(hWnd, message, wParam, lParam); + default: return DefWindowProc(hWnd, message, wParam, lParam); } @@ -1184,7 +1196,7 @@ int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, // Update mouse capture: capture when in-game and no menu is open { static bool altToggleSuppressCapture = false; - bool shouldCapture = app.GetGameStarted() && !ui.GetMenuDisplayed(0); + bool shouldCapture = app.GetGameStarted() && !ui.GetMenuDisplayed(0) && pMinecraft->screen == NULL; // Left Alt key toggles capture on/off for debugging if (KMInput.IsKeyPressed(VK_MENU)) { |
