diff --git a/src/core/CoreData.h b/src/core/CoreData.h new file mode 100644 index 0000000..b87bd19 --- /dev/null +++ b/src/core/CoreData.h @@ -0,0 +1,7 @@ +#pragma once + +#include "ui/managers/debug/DebugData.h" + +struct CoreData { + DebugData debugData; +}; \ No newline at end of file diff --git a/src/core/DebugManager.cpp b/src/core/DebugManager.cpp index 9463bad..ca544d6 100644 --- a/src/core/DebugManager.cpp +++ b/src/core/DebugManager.cpp @@ -5,12 +5,14 @@ DebugManager::DebugManager( const SDL_Renderer* renderer, const SDL_Window* window, //const InputState& inputState, - UIRenderer* uiRenderer + UIRenderer* uiRenderer, + DebugData& debugData ): m_renderer(renderer), m_window(window), //m_inputState(inputState), - m_uiRenderer(uiRenderer) + m_uiRenderer(uiRenderer), + m_debugData(debugData) { } diff --git a/src/core/DebugManager.h b/src/core/DebugManager.h index 4e70841..fc4fbf3 100644 --- a/src/core/DebugManager.h +++ b/src/core/DebugManager.h @@ -10,7 +10,8 @@ public: const SDL_Renderer* renderer, const SDL_Window* window, //const InputState& inputState, - UIRenderer* uiRenderer + UIRenderer* uiRenderer, + DebugData& debugData ); ~DebugManager(); @@ -22,9 +23,13 @@ public: void updateMousePos(int logicalX, int logicalY, const InputState& inputState); void updateDebugInfo(); + DebugData& getDebugData() { + return m_debugData; + } + private: std::unique_ptr m_debugOverlay; - DebugData m_debugData; + DebugData& m_debugData; const SDL_Renderer* m_renderer = nullptr; const SDL_Window* m_window = nullptr; //const InputState& m_inputState; diff --git a/src/core/GameApplication.cpp b/src/core/GameApplication.cpp index 5b06aa0..eab3b99 100644 --- a/src/core/GameApplication.cpp +++ b/src/core/GameApplication.cpp @@ -50,14 +50,15 @@ bool GameApplication::initialize() { m_windowManager->GetRenderer(), m_windowManager->GetWindow(), //m_inputManager->GetInputState(), - m_uiRenderer.get() + m_uiRenderer.get(), + m_coreData.debugData ); m_debugManager->initialize(); // 材质管理 m_textureManager = std::make_unique(m_windowManager->GetRenderer()); // 场景管理,传入窗口句柄以便 SceneManager 能获取窗口尺寸 - m_sceneManager = std::make_unique(m_windowManager->GetRenderer(), m_uiRenderer.get(), m_windowManager->GetWindow(), m_textureManager.get()); + m_sceneManager = std::make_unique(m_windowManager->GetRenderer(), m_uiRenderer.get(), m_windowManager->GetWindow(), m_textureManager.get(), m_coreData); if (!m_sceneManager->initialize()) { SDL_Log("SceneManager 初始化失败!"); return false; diff --git a/src/core/GameApplication.h b/src/core/GameApplication.h index ebdbb85..76d00a3 100644 --- a/src/core/GameApplication.h +++ b/src/core/GameApplication.h @@ -10,6 +10,8 @@ #include "graphics/font/FontManager.h" #include "core/DebugManager.h" #include "graphics/texture/TextureManager.h" +#include "CoreData.h" + class GameApplication { private: @@ -26,6 +28,8 @@ private: Config m_config; void cleanup(); + CoreData m_coreData; + public: GameApplication(); ~GameApplication(); diff --git a/src/game/GameSession.cpp b/src/game/GameSession.cpp index 50509f8..e6a3a61 100644 --- a/src/game/GameSession.cpp +++ b/src/game/GameSession.cpp @@ -159,8 +159,8 @@ void GameSession::nextTurn() { m_currentActionType = ActionType::GROW; if (m_currentPlayer == PlayerID::P1) { - GameRounds++; - std::cout << "GameSession: Current Round is " << GameRounds << "\n"; + m_gameRound++; + std::cout << "GameSession: Current Round is " << m_gameRound << "\n"; } // 回合结束增加生命值 diff --git a/src/game/GameSession.h b/src/game/GameSession.h index 97dfde5..5037a02 100644 --- a/src/game/GameSession.h +++ b/src/game/GameSession.h @@ -27,7 +27,7 @@ private: GamePieceEventCallback m_gamePieceEventCallback; - int GameRounds = 1; + int m_gameRound = 1; @@ -70,6 +70,8 @@ public: m_gamePieceEventCallback = callback; } - + int getRound() { + return m_gameRound; + } }; \ No newline at end of file diff --git a/src/scenes/base/Scene.h b/src/scenes/base/Scene.h index 30d5cd1..85e7223 100644 --- a/src/scenes/base/Scene.h +++ b/src/scenes/base/Scene.h @@ -9,6 +9,7 @@ #include "graphics/ui/UIRenderer.h" #include "scenes/base/SceneEvent.h" #include "graphics/texture/TextureManager.h" +#include "core/CoreData.h" #include /** * @class Scene @@ -31,7 +32,7 @@ public: * @param height 窗口高度 * @param uiRenderer UI 渲染器指针 */ - virtual void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager){}; + virtual void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* CoreData){}; /** * @brief 场景退出 */ @@ -67,7 +68,7 @@ protected: SDL_Renderer* m_renderer; ///< SDL 渲染器指针 TextureManager* m_textureManager; EventCallback m_eventCallback; ///< 场景事件回调函数 - + CoreData* m_coreData; /*void beginFrame() { if (!m_renderer) { SDL_Log("Renderer is null in beginFrame!"); diff --git a/src/scenes/base/SceneManager.cpp b/src/scenes/base/SceneManager.cpp index 6d99861..dbd7b85 100644 --- a/src/scenes/base/SceneManager.cpp +++ b/src/scenes/base/SceneManager.cpp @@ -1,10 +1,11 @@ #include "SceneManager.h" #include "utils/Config.h" -SceneManager::SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager) : +SceneManager::SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager, CoreData& coreData) : m_renderer(renderer), m_uiRenderer(uiRenderer), m_window(window), - m_textureManager(textureManager) + m_textureManager(textureManager), + m_coreData(coreData) { @@ -99,7 +100,7 @@ void SceneManager::pushScene(const std::string& sceneName) { - m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager); + m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager, &m_coreData); } @@ -116,7 +117,7 @@ void SceneManager::popScene() { m_scenes.pop(); if (m_scene) { - m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager); + m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager, &m_coreData); } } } @@ -157,7 +158,7 @@ void SceneManager::changeScene(const std::string& sceneName) { m_scene = target; - m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager); + m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager, &m_coreData); } diff --git a/src/scenes/base/SceneManager.h b/src/scenes/base/SceneManager.h index 1c69589..3583328 100644 --- a/src/scenes/base/SceneManager.h +++ b/src/scenes/base/SceneManager.h @@ -10,6 +10,7 @@ #include "scenes/gameplay/GameScene.h" #include "scenes/menu/MainMenuScene.h" #include "scenes/gameplay/OnlineGameScene.h" +#include "core/CoreData.h" #include #include #include @@ -31,7 +32,7 @@ public: * @param uiRenderer UI 渲染器指针,用于传递给场景进行 UI 渲染 * @param window SDL 窗口指针,用于获取窗口尺寸 */ - SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager); + SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager, CoreData& coreData); /** * @brief 析构函数 * @details 清理场景栈和缓存,释放资源 @@ -137,5 +138,7 @@ private: * @return 返回 {宽度, 高度},如果获取失败则返回默认值 {1600, 900} */ //std::pair getWindowDimensions() const; + + CoreData& m_coreData; }; \ No newline at end of file diff --git a/src/scenes/gameplay/GameScene.cpp b/src/scenes/gameplay/GameScene.cpp index 55ad045..181bb34 100644 --- a/src/scenes/gameplay/GameScene.cpp +++ b/src/scenes/gameplay/GameScene.cpp @@ -53,10 +53,10 @@ void GameScene::handleBoardClick(int row, int col) { m_gameSession->printBoard(); } -void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager){ +void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData){ m_renderer = renderer; m_uiRenderer = uiRenderer; - + m_coreData = coreData; // 使用工厂方法创建UIManager m_gameUIManager = createUIManager(); m_gameUIManager->init(); @@ -129,6 +129,7 @@ void GameScene::handleClick(int logicalX, int logicalY) { } else { SDL_Log("invail cilck aera!"); } + m_coreData->debugData.round = m_gameSession->getRound(); } diff --git a/src/scenes/gameplay/GameScene.h b/src/scenes/gameplay/GameScene.h index b7932db..eddcd4a 100644 --- a/src/scenes/gameplay/GameScene.h +++ b/src/scenes/gameplay/GameScene.h @@ -11,7 +11,7 @@ public: GameScene(); ~GameScene(); - void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager) override; + void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) override; void update() override; void renderWorld() override; // 逻辑世界 diff --git a/src/scenes/gameplay/OnlineGameScene.cpp b/src/scenes/gameplay/OnlineGameScene.cpp index 4f01d45..c37450a 100644 --- a/src/scenes/gameplay/OnlineGameScene.cpp +++ b/src/scenes/gameplay/OnlineGameScene.cpp @@ -37,7 +37,7 @@ std::unique_ptr OnlineGameScene::createUIManager() { return onlineUIManager; } -void OnlineGameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager) { +void OnlineGameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) { // 先创建网络管理器 m_networkManager = std::make_unique(); m_networkManager->setClickEventCallback( @@ -58,7 +58,7 @@ void OnlineGameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIR } ); // 调用父类的onEnter(会调用我们重写的createUIManager) - GameScene::onEnter(renderer, WIDTH, HEIGHT, uiRenderer, textureManager); + GameScene::onEnter(renderer, WIDTH, HEIGHT, uiRenderer, textureManager, coreData); m_gameUIManager->setButton("ActionButton", false); // 初始禁用行动按钮,等待游戏开始 m_gameUIManager->setLabel("PlayerLabel", false); // 初始隐藏玩家回合标签 diff --git a/src/scenes/gameplay/OnlineGameScene.h b/src/scenes/gameplay/OnlineGameScene.h index d39e791..be70b15 100644 --- a/src/scenes/gameplay/OnlineGameScene.h +++ b/src/scenes/gameplay/OnlineGameScene.h @@ -5,7 +5,7 @@ class OnlineGameScene : public GameScene { public: - void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager) override; + void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) override; void renderWorld() override; diff --git a/src/scenes/menu/MainMenuScene.cpp b/src/scenes/menu/MainMenuScene.cpp index a224920..056a7f7 100644 --- a/src/scenes/menu/MainMenuScene.cpp +++ b/src/scenes/menu/MainMenuScene.cpp @@ -4,10 +4,11 @@ MainMenuScene::MainMenuScene() { // 构造函数实现 } -void MainMenuScene::onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager) { +void MainMenuScene::onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) { // 进入场景时的初始化逻辑 m_renderer = renderer; m_uiRenderer = uiRenderer; + m_coreData = coreData; m_mainMenuUIManager = std::make_unique( [this](const std::string& sceneName) { if (m_eventCallback) { diff --git a/src/scenes/menu/MainMenuScene.h b/src/scenes/menu/MainMenuScene.h index 67f892f..7aaced1 100644 --- a/src/scenes/menu/MainMenuScene.h +++ b/src/scenes/menu/MainMenuScene.h @@ -8,7 +8,7 @@ public: ~MainMenuScene() override = default; // 实现 Scene 接口 - void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager) override; + void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) override; void onExit() override; void update() override; diff --git a/src/ui/managers/debug/DebugData.h b/src/ui/managers/debug/DebugData.h index b941a7e..0d144b1 100644 --- a/src/ui/managers/debug/DebugData.h +++ b/src/ui/managers/debug/DebugData.h @@ -9,5 +9,6 @@ struct DebugData { std::pair mousePosition = {0, 0}; std::pair mouseLogicalPostion = {0, 0}; int currentFPS = 0; + int round = 0; }; \ No newline at end of file diff --git a/src/ui/managers/debug/DebugOverlay.cpp b/src/ui/managers/debug/DebugOverlay.cpp index 65070e7..214d686 100644 --- a/src/ui/managers/debug/DebugOverlay.cpp +++ b/src/ui/managers/debug/DebugOverlay.cpp @@ -34,6 +34,14 @@ void DebugOverlay::initialize() { 80 ); m_labels.emplace(mouseLogicalPos->getNameHash(), std::move(mouseLogicalPos)); + + auto roundLabel = UIWidgetFactory::createStandardLabel( + "RoundLabel", + "Round: 0", + 0, + 120 + ); + m_labels.emplace(roundLabel->getNameHash(), std::move(roundLabel)); } @@ -125,4 +133,12 @@ void DebugOverlay::updateDebugInfo() { } else { std::cerr << "Mouse LogicalPosition Label not found!\n"; } + + const auto roundLabelKey = makeHash("RoundLabel"); + auto roundLabel = m_labels.find(roundLabelKey); + if (roundLabel != m_labels.end()) { + roundLabel->second->setText("Round: " + std::to_string(m_debugData.round)); + } else { + std::cerr << "Round Label not found!\n"; + } } \ No newline at end of file