diff --git a/src/core/GameApplication.cpp b/src/core/GameApplication.cpp index 8a52fcd..4bf3fe8 100644 --- a/src/core/GameApplication.cpp +++ b/src/core/GameApplication.cpp @@ -1,5 +1,5 @@ #include "GameApplication.h" - +#include "utils/Tools.h" GameApplication::GameApplication() { } @@ -49,10 +49,11 @@ SDL_AppResult GameApplication::handleInputEvent(SDL_Event* event) { InputState input = m_inputManager->GetInputState(); if (event->type == SDL_EVENT_MOUSE_BUTTON_DOWN && event->button.button == SDL_BUTTON_LEFT) { - - m_sceneManager->handleClickCurrent(input.mouseCilckOn); + auto pos = Tools::physicalToLogical(input.mouseCilckOn.first, input.mouseCilckOn.second, m_windowManager->getViewport()); + m_sceneManager->handleClickCurrent(pos); } - m_sceneManager->handleMousePosition(input.mouseCurrentPosition); + auto pos = Tools::physicalToLogical(input.mouseCurrentPosition.first, input.mouseCurrentPosition.second, m_windowManager->getViewport()); + m_sceneManager->handleMousePosition(pos); m_windowManager->setFullscreen(input.isFullscreen); // 改变窗口时清理旧的缓存 if (event->type == SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) { diff --git a/src/graphics/game/CoordinateConverter.cpp b/src/graphics/game/CoordinateConverter.cpp index 3d0e79a..ab9c312 100644 --- a/src/graphics/game/CoordinateConverter.cpp +++ b/src/graphics/game/CoordinateConverter.cpp @@ -1,5 +1,5 @@ #include "CoordinateConverter.h" -#include "utils/CoordinateTools.h" + CoordinateConverter::CoordinateConverter(SDL_Renderer* renderer) : m_renderer(renderer) { } @@ -8,8 +8,8 @@ CoordinateConverter::~CoordinateConverter() { } -std::optional> CoordinateConverter::ScreenToBoard(float screenX, float screenY, BoardArea area) { - auto [mouseX, mouseY] = physicalToLogical(screenX, screenY, m_renderer); +std::optional> CoordinateConverter::ScreenToBoard(int mouseX, int mouseY, BoardArea area) { + // 判断是否点击在棋盘区域内 if (mouseX < area.x || mouseX >= area.x + area.cellSize * area.cols || mouseY < area.y || mouseY >= area.y + area.cellSize * area.rows) { diff --git a/src/graphics/game/CoordinateConverter.h b/src/graphics/game/CoordinateConverter.h index 81dc4aa..3c7b49d 100644 --- a/src/graphics/game/CoordinateConverter.h +++ b/src/graphics/game/CoordinateConverter.h @@ -8,7 +8,7 @@ public: CoordinateConverter(SDL_Renderer* renderer); ~CoordinateConverter(); // 将物理坐标转化成逻辑坐标 - std::optional> ScreenToBoard(float screenX, float screenY, BoardArea aera); + std::optional> ScreenToBoard(int mouseX, int mouseY, BoardArea aera); private: SDL_Renderer* m_renderer; diff --git a/src/scenes/base/Scene.h b/src/scenes/base/Scene.h index e734ca2..0855ef3 100644 --- a/src/scenes/base/Scene.h +++ b/src/scenes/base/Scene.h @@ -51,13 +51,13 @@ public: * @param x 点击位置的 X 坐标 * @param y 点击位置的 Y 坐标 */ - virtual void handleClick(float x, float y) = 0; + virtual void handleClick(int logicalX, int logicalY) = 0; /** * @brief 渲染鼠标位置相关内容 * @param x 鼠标位置的 X 坐标 * @param y 鼠标位置的 Y 坐标 */ - virtual void renderMousePosition(float x, float y){}; + virtual void renderMousePosition(int logicalX, int logicalY){}; /** * @brief 设置场景事件回调函数 * @param callback 场景事件回调函数 diff --git a/src/scenes/base/SceneManager.cpp b/src/scenes/base/SceneManager.cpp index f94ad6d..0830685 100644 --- a/src/scenes/base/SceneManager.cpp +++ b/src/scenes/base/SceneManager.cpp @@ -147,14 +147,14 @@ void SceneManager::changeScene(const std::string& sceneName) { -void SceneManager::handleClickCurrent(std::pair clickOn) { - auto [screenX, screenY] = clickOn; - if (m_scene) m_scene->handleClick(screenX, screenY); +void SceneManager::handleClickCurrent(std::pair clickOn) { + auto [logicalX, logicalY] = clickOn; + if (m_scene) m_scene->handleClick(logicalX, logicalY); } -void SceneManager::handleMousePosition(std::pair mousePosition) { - auto [screenX, screenY] = mousePosition; - if (m_scene) m_scene->renderMousePosition(screenX, screenY); +void SceneManager::handleMousePosition(std::pair mousePosition) { + auto [logicalX, logicalY] = mousePosition; + if (m_scene) m_scene->renderMousePosition(logicalX, logicalY); } void SceneManager::updateCurrent() { diff --git a/src/scenes/base/SceneManager.h b/src/scenes/base/SceneManager.h index e7a0bfd..4e80b3a 100644 --- a/src/scenes/base/SceneManager.h +++ b/src/scenes/base/SceneManager.h @@ -90,14 +90,14 @@ public: * @param clickOn 点击位置坐标对 {x, y} * @details 将点击事件转发给当前场景的 handleClick() 方法进行处理 */ - void handleClickCurrent(std::pair clickOn); + void handleClickCurrent(std::pair clickOn); /** * @brief 处理当前场景的鼠标位置事件 * @param mousePosition 鼠标位置坐标对 {x, y} * @details 将鼠标位置事件转发给当前场景的 renderMousePosition() 方法进行处理 */ - void handleMousePosition(std::pair mousePosition); + void handleMousePosition(std::pair mousePosition); /** * @brief 更新当前场景 diff --git a/src/scenes/gameplay/GameScene.cpp b/src/scenes/gameplay/GameScene.cpp index c5947af..7e91664 100644 --- a/src/scenes/gameplay/GameScene.cpp +++ b/src/scenes/gameplay/GameScene.cpp @@ -48,8 +48,8 @@ void GameScene::renderUI() { m_uiRenderer->renderUI(m_gameUIManager->getUIRenderData()); } -void GameScene::handleClick(float screenX, float screenY) { - if (m_gameUIManager->handleClick(screenX, screenY)) { +void GameScene::handleClick(int logicalX, int logicalY) { + if (m_gameUIManager->handleClick(logicalX, logicalY)) { return; } @@ -57,7 +57,7 @@ void GameScene::handleClick(float screenX, float screenY) { SDL_Log("Game is not running, click ignored."); return; } - auto click = m_CoordinateConverter->ScreenToBoard(screenX, screenY, m_boardRenderer->getBoardArea()); + auto click = m_CoordinateConverter->ScreenToBoard(logicalX, logicalY, m_boardRenderer->getBoardArea()); if (click) { auto [row, col] = click.value(); m_gameSession->handleCoordinateInput(row, col); @@ -75,8 +75,8 @@ void GameScene::handleClick(float screenX, float screenY) { } } -void GameScene::renderMousePosition(float x, float y) { - m_gameUIManager->UpdateMousePositon(x, y); +void GameScene::renderMousePosition(int logicalX, int logicalY) { + m_gameUIManager->updateMousePositon(logicalX, logicalY); } void GameScene::restartGame() { diff --git a/src/scenes/gameplay/GameScene.h b/src/scenes/gameplay/GameScene.h index 2e97d51..2e71b46 100644 --- a/src/scenes/gameplay/GameScene.h +++ b/src/scenes/gameplay/GameScene.h @@ -16,9 +16,9 @@ public: void update() override; void renderWorld() override; // 逻辑世界 void renderUI() override; // 屏幕 UI - void handleClick(float screenX, float screenY) override; + void handleClick(int logicalX, int logicalYY) override; - void renderMousePosition(float x, float y) override; + void renderMousePosition(int logicalX, int logicalY) override; void restartGame(); private: diff --git a/src/scenes/menu/MainMenuScene.cpp b/src/scenes/menu/MainMenuScene.cpp index 2159918..d1a7363 100644 --- a/src/scenes/menu/MainMenuScene.cpp +++ b/src/scenes/menu/MainMenuScene.cpp @@ -44,12 +44,12 @@ void MainMenuScene::renderUI() { m_uiRenderer->renderUI(uiRenderData); } -void MainMenuScene::handleClick(float x, float y) { +void MainMenuScene::handleClick(int logicalX, int logicalY) { // 处理点击事件 - m_mainMenuUIManager->handleClick(x, y); + m_mainMenuUIManager->handleClick(logicalX, logicalY); } -void MainMenuScene::renderMousePosition(float x, float y) { - m_mainMenuUIManager->UpdateMousePositon(x, y); +void MainMenuScene::renderMousePosition(int logicalX, int logicalY) { + m_mainMenuUIManager->updateMousePositon(logicalX, logicalY); } \ No newline at end of file diff --git a/src/scenes/menu/MainMenuScene.h b/src/scenes/menu/MainMenuScene.h index 475dddf..de407a9 100644 --- a/src/scenes/menu/MainMenuScene.h +++ b/src/scenes/menu/MainMenuScene.h @@ -13,9 +13,9 @@ public: void update() override; void renderWorld() override; // 逻辑世界 void renderUI() override; // 屏幕 UI - void handleClick(float x, float y) override; + void handleClick(int logicalX, int logicalY) override; - void renderMousePosition(float x, float y) override; + void renderMousePosition(int logicalX, int logicalY) override; private: // 其他私有成员变量和方法 std::unique_ptr m_mainMenuUIManager = nullptr; diff --git a/src/ui/base/IUIManager.h b/src/ui/base/IUIManager.h index fb06c5e..106c887 100644 --- a/src/ui/base/IUIManager.h +++ b/src/ui/base/IUIManager.h @@ -20,7 +20,7 @@ public: // 收集渲染数据 virtual void CollectRenderData() = 0; - virtual void UpdateMousePositon(float x, float y) = 0; + virtual void updateMousePositon(int logicalX, int logicalY) = 0; protected: std::unordered_map> m_buttons; diff --git a/src/ui/managers/GameUIManager.cpp b/src/ui/managers/GameUIManager.cpp index 29c9b4b..ec73711 100644 --- a/src/ui/managers/GameUIManager.cpp +++ b/src/ui/managers/GameUIManager.cpp @@ -1,5 +1,5 @@ #include "GameUIManager.h" -#include "utils/CoordinateTools.h" + GameUIManager::GameUIManager(SDL_Renderer* renderer, TextRenderer* textRenderer) { m_renderer = renderer; @@ -50,12 +50,11 @@ void GameUIManager::CollectRenderData() { } } -void GameUIManager::UpdateMousePositon(float x, float y) { +void GameUIManager::updateMousePositon(int logicalX, int logicalY) { - auto logicalPos = physicalToLogical(static_cast(x), static_cast(y), m_renderer); - int lx = logicalPos.first; - int ly = logicalPos.second; - std::string pos = std::to_string(lx) + " " + std::to_string(ly); + + + std::string pos = std::to_string(logicalX) + " " + std::to_string(logicalY); m_labels[makeHash("MousePositionLabel")]->setText(pos); } @@ -163,10 +162,9 @@ void GameUIManager::setupUIComponents() { } -bool GameUIManager::handleClick(float x, float y) { - auto logicalPos = physicalToLogical(static_cast(x), static_cast(y), m_renderer); - int lx = logicalPos.first; - int ly = logicalPos.second; +bool GameUIManager::handleClick(int lx, int ly) { + + // 遍历所有按钮,检查点击位置是否在按钮范围内 for (auto& [id, button] : m_buttons) { diff --git a/src/ui/managers/GameUIManager.h b/src/ui/managers/GameUIManager.h index 28d36b3..3dee1aa 100644 --- a/src/ui/managers/GameUIManager.h +++ b/src/ui/managers/GameUIManager.h @@ -16,13 +16,13 @@ public: // 收集渲染数据 void CollectRenderData(); - void UpdateMousePositon(float x, float y); + void updateMousePositon(int logicalX, int logicalY); void updateActionType(ActionType type); void updateGameState(GameState state); - bool handleClick(float x, float y); + bool handleClick(int logicalX, int logicalY); private: std::function m_restartCallback; void setupUIComponents(); diff --git a/src/ui/managers/MainMenuUIManager.cpp b/src/ui/managers/MainMenuUIManager.cpp index eee6201..18bebba 100644 --- a/src/ui/managers/MainMenuUIManager.cpp +++ b/src/ui/managers/MainMenuUIManager.cpp @@ -1,5 +1,5 @@ #include "MainMenuUIManager.h" -#include "utils/CoordinateTools.h" + #include "ui/base/UIWidgetFactory.h" MainMenuUIManager::MainMenuUIManager(SDL_Renderer* renderer, TextRenderer* textRenderer, @@ -47,11 +47,10 @@ void MainMenuUIManager::CollectRenderData() { } } -void MainMenuUIManager::UpdateMousePositon(float x, float y) { - auto logicalPos = physicalToLogical(static_cast(x), static_cast(y), m_renderer); - int lx = logicalPos.first; - int ly = logicalPos.second; - std::string pos = std::to_string(lx) + " " + std::to_string(ly); +void MainMenuUIManager::updateMousePositon(int logicalX, int logicalY) { + + + std::string pos = std::to_string(logicalX) + " " + std::to_string(logicalY); m_labels[makeHash("MousePositionLabel")]->setText(pos); } @@ -61,11 +60,11 @@ const UIRenderData& MainMenuUIManager::getUIRenderData() { return m_uiRenderData; } -void MainMenuUIManager::handleClick(float x, float y) { - auto logicPos = physicalToLogical(x, y, m_renderer); +void MainMenuUIManager::handleClick(int logicalX, int logicalY) { + for (auto& buttonPair : m_buttons) { - SDL_Log("Handling click at logical position (%d, %d)\n", logicPos.first, logicPos.second); - if (buttonPair.second->handleCilck(logicPos.first, logicPos.second)) { + SDL_Log("Handling click at logical position (%d, %d)\n", logicalX, logicalY); + if (buttonPair.second->handleCilck(logicalX, logicalY)) { return; } } diff --git a/src/ui/managers/MainMenuUIManager.h b/src/ui/managers/MainMenuUIManager.h index 564e465..d76b37b 100644 --- a/src/ui/managers/MainMenuUIManager.h +++ b/src/ui/managers/MainMenuUIManager.h @@ -19,9 +19,9 @@ public: void CollectRenderData() override; - void UpdateMousePositon(float x, float y) override; + void updateMousePositon(int logicalX, int logicalY) override; - void handleClick(float x, float y); + void handleClick(int logicalX, int logicalY); private: SceneEventCallback m_eventCallback;