From a980f2bd663649bb975ad51c30bfaa0e96c3a9c3 Mon Sep 17 00:00:00 2001 From: ssdfasd <2156608475@qq.com> Date: Sun, 22 Mar 2026 15:25:53 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8DInputManager=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E6=B3=A8=E9=87=8A=E8=AD=A6=E5=91=8A=E5=92=8C=E5=AE=8C?= =?UTF-8?q?=E5=96=84Update=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - InputManager.h: 移除中文注释修复C4819警告 - InputManager.h: 添加缺失的vector和unordered_map头文件 - InputManager.cpp: Update()现正确清除m_keyDownThisFrame状态 - InputManager.cpp: ProcessKeyDown/Up添加修饰键参数 - WindowsInputModule: 传递alt/ctrl/shift修饰键状态 --- engine/include/XCEngine/Input/InputManager.h | 14 +++------- engine/src/Input/InputManager.cpp | 28 ++++++++++++------- .../src/Input/Windows/WindowsInputModule.cpp | 14 ++++++++-- 3 files changed, 34 insertions(+), 22 deletions(-) diff --git a/engine/include/XCEngine/Input/InputManager.h b/engine/include/XCEngine/Input/InputManager.h index 00f2c866..f3f37542 100644 --- a/engine/include/XCEngine/Input/InputManager.h +++ b/engine/include/XCEngine/Input/InputManager.h @@ -4,6 +4,8 @@ #include "InputEvent.h" #include "InputAxis.h" #include "Math/Vector2.h" +#include +#include namespace XCEngine { namespace Input { @@ -16,8 +18,6 @@ public: void Shutdown(); void Update(float deltaTime); - // ============ 轮询接口 ============ - bool IsKeyDown(KeyCode key) const; bool IsKeyUp(KeyCode key) const; bool IsKeyPressed(KeyCode key) const; @@ -32,8 +32,6 @@ public: int GetTouchCount() const; TouchState GetTouch(int index) const; - // ============ 轴接口 (参考 Unity) ============ - float GetAxis(const Containers::String& axisName) const; float GetAxisRaw(const Containers::String& axisName) const; @@ -45,18 +43,14 @@ public: void RegisterButton(const Containers::String& name, KeyCode key); void ClearAxes(); - // ============ 事件接口 ============ - Core::Event& OnKeyEvent() { return m_onKeyEvent; } Core::Event& OnMouseButton() { return m_onMouseButton; } Core::Event& OnMouseMove() { return m_onMouseMove; } Core::Event& OnMouseWheel() { return m_onMouseWheel; } Core::Event& OnTextInput() { return m_onTextInput; } - // ============ 内部方法(供 PlatformInputModule 调用) ============ - - void ProcessKeyDown(KeyCode key, bool repeat); - void ProcessKeyUp(KeyCode key); + void ProcessKeyDown(KeyCode key, bool repeat, bool alt, bool ctrl, bool shift, bool meta); + void ProcessKeyUp(KeyCode key, bool alt, bool ctrl, bool shift, bool meta); void ProcessMouseMove(int x, int y, int deltaX, int deltaY); void ProcessMouseButton(MouseButton button, bool pressed, int x, int y); void ProcessMouseWheel(float delta, int x, int y); diff --git a/engine/src/Input/InputManager.cpp b/engine/src/Input/InputManager.cpp index 4c1e0503..1f0d4934 100644 --- a/engine/src/Input/InputManager.cpp +++ b/engine/src/Input/InputManager.cpp @@ -62,8 +62,16 @@ void InputManager::Update(float deltaTime) { if (!m_initialized) return; m_keyDownLastFrame = m_keyDownThisFrame; + m_keyDownThisFrame.clear(); + m_keyDownThisFrame.resize(256, false); + m_mouseButtonDownLastFrame = m_mouseButtonDownThisFrame; + m_mouseButtonDownThisFrame.clear(); + m_mouseButtonDownThisFrame.resize(5, false); + m_buttonDownLastFrame = m_buttonDownThisFrame; + m_buttonDownThisFrame.clear(); + m_buttonDownThisFrame.resize(32, false); m_mouseDelta = Math::Vector2::Zero(); m_mouseScrollDelta = 0.0f; @@ -203,7 +211,7 @@ void InputManager::ClearAxes() { m_buttons.clear(); } -void InputManager::ProcessKeyDown(KeyCode key, bool repeat) { +void InputManager::ProcessKeyDown(KeyCode key, bool repeat, bool alt, bool ctrl, bool shift, bool meta) { if (!m_initialized) return; size_t index = GetKeyIndex(key); @@ -215,15 +223,15 @@ void InputManager::ProcessKeyDown(KeyCode key, bool repeat) { KeyEvent event; event.keyCode = key; event.type = repeat ? KeyEvent::Repeat : KeyEvent::Down; - event.alt = false; - event.ctrl = false; - event.shift = false; - event.meta = false; + event.alt = alt; + event.ctrl = ctrl; + event.shift = shift; + event.meta = meta; m_onKeyEvent.Invoke(event); } -void InputManager::ProcessKeyUp(KeyCode key) { +void InputManager::ProcessKeyUp(KeyCode key, bool alt, bool ctrl, bool shift, bool meta) { if (!m_initialized) return; size_t index = GetKeyIndex(key); @@ -234,10 +242,10 @@ void InputManager::ProcessKeyUp(KeyCode key) { KeyEvent event; event.keyCode = key; event.type = KeyEvent::Up; - event.alt = false; - event.ctrl = false; - event.shift = false; - event.meta = false; + event.alt = alt; + event.ctrl = ctrl; + event.shift = shift; + event.meta = meta; m_onKeyEvent.Invoke(event); } diff --git a/engine/src/Input/Windows/WindowsInputModule.cpp b/engine/src/Input/Windows/WindowsInputModule.cpp index 042d3d34..f59fe181 100644 --- a/engine/src/Input/Windows/WindowsInputModule.cpp +++ b/engine/src/Input/Windows/WindowsInputModule.cpp @@ -97,16 +97,26 @@ void WindowsInputModule::ProcessKeyDown(WPARAM wParam, LPARAM lParam) { bool repeat = (lParam & (1 << 30)) != 0; KeyCode keyCode = VKCodeToKeyCode(static_cast(wParam)); + bool alt = (GetKeyState(VK_MENU) & 0x8000) != 0; + bool ctrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0; + bool shift = (GetKeyState(VK_SHIFT) & 0x8000) != 0; + bool meta = false; + if (keyCode != KeyCode::None) { - InputManager::Get().ProcessKeyDown(keyCode, repeat); + InputManager::Get().ProcessKeyDown(keyCode, repeat, alt, ctrl, shift, meta); } } void WindowsInputModule::ProcessKeyUp(WPARAM wParam) { KeyCode keyCode = VKCodeToKeyCode(static_cast(wParam)); + bool alt = (GetKeyState(VK_MENU) & 0x8000) != 0; + bool ctrl = (GetKeyState(VK_CONTROL) & 0x8000) != 0; + bool shift = (GetKeyState(VK_SHIFT) & 0x8000) != 0; + bool meta = false; + if (keyCode != KeyCode::None) { - InputManager::Get().ProcessKeyUp(keyCode); + InputManager::Get().ProcessKeyUp(keyCode, alt, ctrl, shift, meta); } }