aboutsummaryrefslogtreecommitdiff
path: root/Minecraft.Client/Windows64
diff options
context:
space:
mode:
authordaoge_cmd <3523206925@qq.com>2026-03-01 19:59:48 +0800
committerdaoge_cmd <3523206925@qq.com>2026-03-01 19:59:48 +0800
commit2aee607d6c474ce2a36fa9a37dab291a687f524f (patch)
tree71b50fdad00abcee0b859cf08b26a48484c7c66c /Minecraft.Client/Windows64
parente067d710e352052c6b79fe40d4c6aa27bd296056 (diff)
feat: implement game-tick input handling and per-frame edge detection
Diffstat (limited to 'Minecraft.Client/Windows64')
-rw-r--r--Minecraft.Client/Windows64/GameHDD/20140401093851/saveData.msbin3761681 -> 5282705 bytes
-rw-r--r--Minecraft.Client/Windows64/KeyboardMouseInput.cpp62
-rw-r--r--Minecraft.Client/Windows64/KeyboardMouseInput.h25
3 files changed, 55 insertions, 32 deletions
diff --git a/Minecraft.Client/Windows64/GameHDD/20140401093851/saveData.ms b/Minecraft.Client/Windows64/GameHDD/20140401093851/saveData.ms
index c227422d..939d5139 100644
--- a/Minecraft.Client/Windows64/GameHDD/20140401093851/saveData.ms
+++ b/Minecraft.Client/Windows64/GameHDD/20140401093851/saveData.ms
Binary files differ
diff --git a/Minecraft.Client/Windows64/KeyboardMouseInput.cpp b/Minecraft.Client/Windows64/KeyboardMouseInput.cpp
index e67946da..791eb272 100644
--- a/Minecraft.Client/Windows64/KeyboardMouseInput.cpp
+++ b/Minecraft.Client/Windows64/KeyboardMouseInput.cpp
@@ -7,11 +7,8 @@
KeyboardMouseInput KMInput;
KeyboardMouseInput::KeyboardMouseInput()
- : m_mouseDeltaX(0.0f)
- , m_mouseDeltaY(0.0f)
- , m_mouseDeltaXAccum(0.0f)
+ : m_mouseDeltaXAccum(0.0f)
, m_mouseDeltaYAccum(0.0f)
- , m_scrollDelta(0)
, m_scrollDeltaAccum(0)
, m_captured(false)
, m_hWnd(NULL)
@@ -21,6 +18,8 @@ KeyboardMouseInput::KeyboardMouseInput()
memset(m_keyStatePrev, 0, sizeof(m_keyStatePrev));
memset(m_mouseButtons, 0, sizeof(m_mouseButtons));
memset(m_mouseButtonsPrev, 0, sizeof(m_mouseButtonsPrev));
+ memset(m_keyPressedAccum, 0, sizeof(m_keyPressedAccum));
+ memset(m_mousePressedAccum, 0, sizeof(m_mousePressedAccum));
}
KeyboardMouseInput::~KeyboardMouseInput()
@@ -47,16 +46,6 @@ void KeyboardMouseInput::Init(HWND hWnd)
void KeyboardMouseInput::Tick()
{
- // Snapshot accumulated mouse deltas
- m_mouseDeltaX = m_mouseDeltaXAccum;
- m_mouseDeltaY = m_mouseDeltaYAccum;
- m_mouseDeltaXAccum = 0.0f;
- m_mouseDeltaYAccum = 0.0f;
-
- // Snapshot scroll delta
- m_scrollDelta = m_scrollDeltaAccum;
- m_scrollDeltaAccum = 0;
-
// Keep cursor pinned to center while captured
if (m_captured)
CenterCursor();
@@ -65,7 +54,7 @@ void KeyboardMouseInput::Tick()
void KeyboardMouseInput::EndFrame()
{
// Advance previous state for next frame's edge detection.
- // Must be called AFTER all consumers have read IsKeyPressed/Released etc.
+ // Must be called AFTER all per-frame consumers have read IsKeyPressed/Released etc.
memcpy(m_keyStatePrev, m_keyState, sizeof(m_keyState));
memcpy(m_mouseButtonsPrev, m_mouseButtons, sizeof(m_mouseButtons));
}
@@ -74,6 +63,7 @@ void KeyboardMouseInput::OnKeyDown(WPARAM vk)
{
if (vk < 256)
{
+ if (!m_keyState[vk]) m_keyPressedAccum[vk] = true;
m_keyState[vk] = true;
}
}
@@ -112,6 +102,7 @@ void KeyboardMouseInput::OnMouseButton(int button, bool down)
{
if (button >= 0 && button < 3)
{
+ if (down && !m_mouseButtons[button]) m_mousePressedAccum[button] = true;
m_mouseButtons[button] = down;
}
}
@@ -125,12 +116,14 @@ 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));
m_mouseDeltaXAccum = 0.0f;
m_mouseDeltaYAccum = 0.0f;
m_scrollDeltaAccum = 0;
}
-// Key queries
+// Per-frame key queries
bool KeyboardMouseInput::IsKeyDown(int vk) const
{
if (vk < 0 || vk >= 256) return false;
@@ -149,7 +142,7 @@ bool KeyboardMouseInput::IsKeyReleased(int vk) const
return !m_keyState[vk] && m_keyStatePrev[vk];
}
-// Mouse button queries
+// Per-frame mouse button queries
bool KeyboardMouseInput::IsMouseDown(int btn) const
{
if (btn < 0 || btn >= 3) return false;
@@ -168,10 +161,37 @@ bool KeyboardMouseInput::IsMouseReleased(int btn) const
return !m_mouseButtons[btn] && m_mouseButtonsPrev[btn];
}
-// Delta queries
-float KeyboardMouseInput::GetMouseDeltaX() const { return m_mouseDeltaX; }
-float KeyboardMouseInput::GetMouseDeltaY() const { return m_mouseDeltaY; }
-int KeyboardMouseInput::GetScrollDelta() const { return m_scrollDelta; }
+// Game-tick consume methods
+bool KeyboardMouseInput::ConsumeKeyPress(int vk)
+{
+ if (vk < 0 || vk >= 256) return false;
+ bool pressed = m_keyPressedAccum[vk];
+ m_keyPressedAccum[vk] = false;
+ return pressed;
+}
+
+bool KeyboardMouseInput::ConsumeMousePress(int btn)
+{
+ if (btn < 0 || btn >= 3) return false;
+ bool pressed = m_mousePressedAccum[btn];
+ m_mousePressedAccum[btn] = false;
+ return pressed;
+}
+
+void KeyboardMouseInput::ConsumeMouseDelta(float &dx, float &dy)
+{
+ dx = m_mouseDeltaXAccum;
+ dy = m_mouseDeltaYAccum;
+ m_mouseDeltaXAccum = 0.0f;
+ m_mouseDeltaYAccum = 0.0f;
+}
+
+int KeyboardMouseInput::ConsumeScrollDelta()
+{
+ int delta = m_scrollDeltaAccum;
+ m_scrollDeltaAccum = 0;
+ return delta;
+}
// Mouse capture
void KeyboardMouseInput::SetCapture(bool capture)
diff --git a/Minecraft.Client/Windows64/KeyboardMouseInput.h b/Minecraft.Client/Windows64/KeyboardMouseInput.h
index 722c9f3d..4d272f91 100644
--- a/Minecraft.Client/Windows64/KeyboardMouseInput.h
+++ b/Minecraft.Client/Windows64/KeyboardMouseInput.h
@@ -30,20 +30,20 @@ public:
void OnMouseWheel(int delta);
void ClearAllState();
- // Key state queries (call after Tick)
+ // 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;
-
- // Mouse button queries: 0=left, 1=right, 2=middle
bool IsMouseDown(int btn) const;
bool IsMousePressed(int btn) const;
bool IsMouseReleased(int btn) const;
- // Mouse deltas (consumed each Tick)
- float GetMouseDeltaX() const;
- float GetMouseDeltaY() const;
- int GetScrollDelta() 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);
+ void ConsumeMouseDelta(float &dx, float &dy);
+ int ConsumeScrollDelta();
// Mouse capture for FPS look
void SetCapture(bool capture);
@@ -52,18 +52,21 @@ public:
private:
void CenterCursor();
+ // 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];
- float m_mouseDeltaX;
- float m_mouseDeltaY;
+ // Sticky press accumulators (persist until consumed by game tick)
+ bool m_keyPressedAccum[256];
+ bool m_mousePressedAccum[3];
+
+ // Mouse delta accumulators (persist until consumed by game tick)
float m_mouseDeltaXAccum;
float m_mouseDeltaYAccum;
- int m_scrollDelta;
+ // Scroll accumulator (persists until consumed by game tick)
int m_scrollDeltaAccum;
bool m_captured;