aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Windows64/KeyboardMouseInput.h
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-04 21:19:40 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-05 01:12:48 +0800
commit1dc8a005ed111463c22c17b487e5ec8a3e2d30f3 (patch)
tree8f1825364bf14178f720ee124b01de78afa16d40 /Minecraft.Client/Windows64/KeyboardMouseInput.h
parentac03b88a907bb49f5159f08de07398f3fce32991 (diff)
refactor: refactor KBM input code
Diffstat (limited to 'Minecraft.Client/Windows64/KeyboardMouseInput.h')
-rw-r--r--Minecraft.Client/Windows64/KeyboardMouseInput.h166
1 files changed, 104 insertions, 62 deletions
diff --git a/Minecraft.Client/Windows64/KeyboardMouseInput.h b/Minecraft.Client/Windows64/KeyboardMouseInput.h
index a09843f9..f098ccab 100644
--- a/Minecraft.Client/Windows64/KeyboardMouseInput.h
+++ b/Minecraft.Client/Windows64/KeyboardMouseInput.h
@@ -4,88 +4,130 @@
#include <windows.h>
-// HID usage page and usage for raw input registration
-#ifndef HID_USAGE_PAGE_GENERIC
-#define HID_USAGE_PAGE_GENERIC ((USHORT)0x01)
-#endif
-#ifndef HID_USAGE_GENERIC_MOUSE
-#define HID_USAGE_GENERIC_MOUSE ((USHORT)0x02)
-#endif
-
class KeyboardMouseInput
{
public:
- KeyboardMouseInput();
- ~KeyboardMouseInput();
-
- void Init(HWND hWnd);
+ static const int MAX_KEYS = 256;
+
+ static const int MOUSE_LEFT = 0;
+ static const int MOUSE_RIGHT = 1;
+ static const int MOUSE_MIDDLE = 2;
+ static const int MAX_MOUSE_BUTTONS = 3;
+
+ static const int KEY_FORWARD = 'W';
+ static const int KEY_BACKWARD = 'S';
+ static const int KEY_LEFT = 'A';
+ static const int KEY_RIGHT = 'D';
+ static const int KEY_JUMP = VK_SPACE;
+ static const int KEY_SNEAK = VK_LSHIFT;
+ static const int KEY_SPRINT = VK_LCONTROL;
+ static const int KEY_INVENTORY = 'E';
+ static const int KEY_DROP = 'Q';
+ static const int KEY_CRAFTING = 'C';
+ static const int KEY_CRAFTING_ALT = 'R';
+ static const int KEY_CONFIRM = VK_RETURN;
+ static const int KEY_CANCEL = VK_ESCAPE;
+ static const int KEY_PAUSE = VK_ESCAPE;
+ static const int KEY_THIRD_PERSON = VK_F5;
+ static const int KEY_DEBUG_INFO = VK_F3;
+
+ void Init();
void Tick();
- void EndFrame();
+ void ClearAllState();
- // Called from WndProc
- void OnKeyDown(WPARAM vk);
- void OnKeyUp(WPARAM vk);
- void OnRawMouseInput(LPARAM lParam);
- void OnMouseButton(int button, bool down);
+ void OnKeyDown(int vkCode);
+ void OnKeyUp(int vkCode);
+ void OnMouseButtonDown(int button);
+ void OnMouseButtonUp(int button);
+ void OnMouseMove(int x, int y);
void OnMouseWheel(int delta);
- void ClearAllState();
+ void OnRawMouseDelta(int dx, int dy);
+
+ bool IsKeyDown(int vkCode) const;
+ bool IsKeyPressed(int vkCode) const;
+ bool IsKeyReleased(int vkCode) const;
+
+ bool IsMouseButtonDown(int button) const;
+ bool IsMouseButtonPressed(int button) const;
+ bool IsMouseButtonReleased(int button) const;
- // Per-frame edge detection (for UI / per-frame logic like Alt toggle)
- bool IsKeyDown(int vk) const;
- bool IsKeyPressed(int vk) const;
- bool IsKeyReleased(int vk) const;
- bool IsMouseDown(int btn) const;
- bool IsMousePressed(int btn) const;
- bool IsMouseReleased(int btn) const;
-
- // Game-tick consume methods: accumulate across frames, clear on read.
- // Use these from code that runs at game tick rate (20Hz).
- bool ConsumeKeyPress(int vk);
- bool ConsumeMousePress(int btn);
- bool ConsumeMouseRelease(int btn);
+ int GetMouseX() const { return m_mouseX; }
+ int GetMouseY() const { return m_mouseY; }
+
+ int GetMouseDeltaX() const { return m_mouseDeltaX; }
+ int GetMouseDeltaY() const { return m_mouseDeltaY; }
+
+ int GetMouseWheel();
+ int PeekMouseWheel() const { return m_mouseWheelAccum; }
+ void ConsumeMouseWheel() { m_mouseWheelAccum = 0; }
+
+ // Per-frame delta consumption for low-latency mouse look.
+ // Reads and clears the raw accumulators (not the per-tick snapshot).
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;
+ void SetMouseGrabbed(bool grabbed);
+ bool IsMouseGrabbed() const { return m_mouseGrabbed; }
- // Mouse capture for FPS look
- void SetCapture(bool capture);
- bool IsCaptured() const;
+ void SetCursorHiddenForUI(bool hidden);
+ bool IsCursorHiddenForUI() const { return m_cursorHiddenForUI; }
-private:
- void CenterCursor();
+ void SetWindowFocused(bool focused);
+ bool IsWindowFocused() const { return m_windowFocused; }
- // Per-frame double-buffered state (for IsKeyPressed/Released per-frame edge detection)
- bool m_keyState[256];
- bool m_keyStatePrev[256];
- bool m_mouseButtons[3];
- bool m_mouseButtonsPrev[3];
+ bool HasAnyInput() const { return m_hasInput; }
- // Sticky press accumulators (persist until consumed by game tick)
- bool m_keyPressedAccum[256];
- bool m_mousePressedAccum[3];
- bool m_mouseReleasedAccum[3];
+ void SetKBMActive(bool active) { m_kbmActive = active; }
+ bool IsKBMActive() const { return m_kbmActive; }
- // Mouse delta accumulators (persist until consumed by game tick)
- float m_mouseDeltaXAccum;
- float m_mouseDeltaYAccum;
+ void SetScreenCursorHidden(bool hidden) { m_screenWantsCursorHidden = hidden; }
+ bool IsScreenCursorHidden() const { return m_screenWantsCursorHidden; }
- // Scroll accumulator (persists until consumed by game tick)
- int m_scrollDeltaAccum;
+ float GetMoveX() const;
+ float GetMoveY() const;
- bool m_captured;
- HWND m_hWnd;
- bool m_initialized;
+ float GetLookX(float sensitivity) const;
+ float GetLookY(float sensitivity) const;
+
+private:
+ bool m_keyDown[MAX_KEYS];
+ bool m_keyDownPrev[MAX_KEYS];
+
+ bool m_keyPressedAccum[MAX_KEYS];
+ bool m_keyReleasedAccum[MAX_KEYS];
+ bool m_keyPressed[MAX_KEYS];
+ bool m_keyReleased[MAX_KEYS];
+
+ bool m_mouseButtonDown[MAX_MOUSE_BUTTONS];
+ bool m_mouseButtonDownPrev[MAX_MOUSE_BUTTONS];
+
+ bool m_mouseBtnPressedAccum[MAX_MOUSE_BUTTONS];
+ bool m_mouseBtnReleasedAccum[MAX_MOUSE_BUTTONS];
+ bool m_mouseBtnPressed[MAX_MOUSE_BUTTONS];
+ bool m_mouseBtnReleased[MAX_MOUSE_BUTTONS];
- // Absolute cursor position in client coordinates
int m_mouseX;
int m_mouseY;
+
+ int m_mouseDeltaX;
+ int m_mouseDeltaY;
+ int m_mouseDeltaAccumX;
+ int m_mouseDeltaAccumY;
+
+ int m_mouseWheelAccum;
+
+ bool m_mouseGrabbed;
+
+ bool m_cursorHiddenForUI;
+
+ bool m_windowFocused;
+
+ bool m_hasInput;
+
+ bool m_kbmActive;
+
+ bool m_screenWantsCursorHidden;
};
-extern KeyboardMouseInput KMInput;
+extern KeyboardMouseInput g_KBMInput;
#endif // _WINDOWS64