diff --git a/src/core/CoreData.h b/src/core/CoreData.h index 1d65769..9d1bbe6 100644 --- a/src/core/CoreData.h +++ b/src/core/CoreData.h @@ -3,8 +3,15 @@ #include "ui/managers/debug/DebugData.h" #include "input/InputState.h" #include "scenes/base/SceneEvent.h" +#include "graphics/ui/UIRenderer.h" +#include "graphics/texture/TextureManager.h" + struct CoreData { DebugData debugData; InputState inputState; SceneType sceneType = SceneType::MainMenuScene; + SDL_Renderer* renderer = nullptr; + UIRenderer* uiRenderer = nullptr; + SDL_Window* window = nullptr; + TextureManager* textureManager = nullptr; }; \ No newline at end of file diff --git a/src/core/GameApplication.cpp b/src/core/GameApplication.cpp index dc85051..ccdbd33 100644 --- a/src/core/GameApplication.cpp +++ b/src/core/GameApplication.cpp @@ -57,8 +57,13 @@ bool GameApplication::initialize() { // 材质管理 m_textureManager = std::make_unique(m_windowManager->GetRenderer()); + m_coreData.renderer = m_windowManager->GetRenderer(); + m_coreData.uiRenderer = m_uiRenderer.get(); + m_coreData.window = m_windowManager->GetWindow(); + m_coreData.textureManager = m_textureManager.get(); + // 场景管理,传入窗口句柄以便 SceneManager 能获取窗口尺寸 - m_sceneManager = std::make_unique(m_windowManager->GetRenderer(), m_uiRenderer.get(), m_windowManager->GetWindow(), m_textureManager.get(), m_coreData); + m_sceneManager = std::make_unique(m_coreData); if (!m_sceneManager->initialize()) { SDL_Log("SceneManager 初始化失败!"); return false; diff --git a/src/scenes/base/Scene.h b/src/scenes/base/Scene.h index 19ec549..1d2c1aa 100644 --- a/src/scenes/base/Scene.h +++ b/src/scenes/base/Scene.h @@ -33,7 +33,7 @@ public: * @param height 窗口高度 * @param uiRenderer UI 渲染器指针 */ - virtual void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* CoreData){}; + virtual void onEnter(CoreData* CoreData){}; /** * @brief 场景退出 */ @@ -64,10 +64,6 @@ public: m_eventCallback = std::move(callback); } protected: - // UIRenderer应该由上层管理 - UIRenderer* m_uiRenderer; ///< UI 渲染器指针 - SDL_Renderer* m_renderer; ///< SDL 渲染器指针 - TextureManager* m_textureManager; EventCallback m_eventCallback; ///< 场景事件回调函数 CoreData* m_coreData; /*void beginFrame() { diff --git a/src/scenes/base/SceneManager.cpp b/src/scenes/base/SceneManager.cpp index c89399c..a1790c3 100644 --- a/src/scenes/base/SceneManager.cpp +++ b/src/scenes/base/SceneManager.cpp @@ -1,10 +1,6 @@ #include "SceneManager.h" #include "utils/Config.h" -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), +SceneManager::SceneManager(CoreData& coreData) : m_coreData(coreData) { @@ -104,7 +100,7 @@ void SceneManager::pushScene(SceneType sceneType) { - m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager, &m_coreData); + m_scene->onEnter(&m_coreData); } @@ -121,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_coreData); + m_scene->onEnter(&m_coreData); } } } @@ -163,7 +159,7 @@ void SceneManager::changeScene(SceneType sceneType) { m_coreData.sceneType = sceneType; - m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager, &m_coreData); + m_scene->onEnter(&m_coreData); } diff --git a/src/scenes/base/SceneManager.h b/src/scenes/base/SceneManager.h index 8f105b4..8de5002 100644 --- a/src/scenes/base/SceneManager.h +++ b/src/scenes/base/SceneManager.h @@ -33,7 +33,7 @@ public: * @param uiRenderer UI 渲染器指针,用于传递给场景进行 UI 渲染 * @param window SDL 窗口指针,用于获取窗口尺寸 */ - SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager, CoreData& coreData); + SceneManager(CoreData& coreData); /** * @brief 析构函数 * @details 清理场景栈和缓存,释放资源 @@ -125,10 +125,6 @@ public: void destoryQuitedScene(); private: - SDL_Renderer* m_renderer; ///< SDL 渲染器指针 - SDL_Window* m_window; ///< SDL 窗口指针 - UIRenderer* m_uiRenderer; ///< UI 渲染器指针 - TextureManager* m_textureManager; ///< 材质管理器指针 std::shared_ptr m_scene; ///< 当前场景(使用 shared_ptr 便于在缓存和栈中共享) std::stack> m_scenes; ///< 场景栈,存储场景层级关系(使用 shared_ptr) std::unordered_map, SceneTypeHash> m_sceneCache; ///< 场景缓存,按名字缓存场景以便切换时复用 diff --git a/src/scenes/gameplay/GameScene.cpp b/src/scenes/gameplay/GameScene.cpp index 22a564f..a47d0e1 100644 --- a/src/scenes/gameplay/GameScene.cpp +++ b/src/scenes/gameplay/GameScene.cpp @@ -54,9 +54,9 @@ void GameScene::handleBoardClick(int row, int col) { m_gameSession->printBoard(); } -void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData){ - m_renderer = renderer; - m_uiRenderer = uiRenderer; +void GameScene::onEnter(CoreData* coreData){ + coreData->renderer; + coreData->uiRenderer; m_coreData = coreData; // 使用工厂方法创建UIManager m_gameUIManager = createUIManager(); @@ -65,9 +65,9 @@ void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRendere this->restartGame(); }); - m_boardRenderer = std::make_unique(WIDTH, HEIGHT, renderer, textureManager); + m_boardRenderer = std::make_unique(UI::LogicalWidth, UI::LogicalHeight, coreData->renderer, coreData->textureManager); m_gameSession = std::make_unique(); - m_CoordinateConverter = std::make_unique(renderer); + m_CoordinateConverter = std::make_unique(coreData->renderer); m_gameSession->initialize(); m_boardRenderer->setBoard(m_gameSession->getBoard()); @@ -100,7 +100,7 @@ void GameScene::renderWorld() { } void GameScene::renderUI() { - m_uiRenderer->renderUI(m_gameUIManager->getUIRenderData()); + m_coreData->uiRenderer->renderUI(m_gameUIManager->getUIRenderData()); } void GameScene::handleClick(int logicalX, int logicalY) { diff --git a/src/scenes/gameplay/GameScene.h b/src/scenes/gameplay/GameScene.h index edf2722..5c2e038 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, CoreData* coreData) override; + void onEnter(CoreData* coreData) override; void update() override; void renderWorld() override; // 逻辑世界 diff --git a/src/scenes/gameplay/OnlineGameScene.cpp b/src/scenes/gameplay/OnlineGameScene.cpp index 76cb03b..4ef521f 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, CoreData* coreData) { +void OnlineGameScene::onEnter(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, coreData); + GameScene::onEnter(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 be70b15..644cd20 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, CoreData* coreData) override; + void onEnter(CoreData* coreData) override; void renderWorld() override; diff --git a/src/scenes/menu/MainMenuScene.cpp b/src/scenes/menu/MainMenuScene.cpp index 6f72eb7..4c23f60 100644 --- a/src/scenes/menu/MainMenuScene.cpp +++ b/src/scenes/menu/MainMenuScene.cpp @@ -4,10 +4,8 @@ MainMenuScene::MainMenuScene() { // 构造函数实现 } -void MainMenuScene::onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) { +void MainMenuScene::onEnter(CoreData* coreData) { // 进入场景时的初始化逻辑 - m_renderer = renderer; - m_uiRenderer = uiRenderer; m_coreData = coreData; m_mainMenuUIManager = std::make_unique( [this](SceneType sceneType) { @@ -40,7 +38,7 @@ void MainMenuScene::renderWorld() { void MainMenuScene::renderUI() { const UIRenderData& uiRenderData = m_mainMenuUIManager->getUIRenderData(); - m_uiRenderer->renderUI(uiRenderData); + m_coreData->uiRenderer->renderUI(uiRenderData); } void MainMenuScene::handleClick(int logicalX, int logicalY) { diff --git a/src/scenes/menu/MainMenuScene.h b/src/scenes/menu/MainMenuScene.h index 7aaced1..096cb92 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, CoreData* coreData) override; + void onEnter(CoreData* coreData) override; void onExit() override; void update() override; diff --git a/src/scenes/other/BadAppleScene.cpp b/src/scenes/other/BadAppleScene.cpp index da69a39..2d10cd0 100644 --- a/src/scenes/other/BadAppleScene.cpp +++ b/src/scenes/other/BadAppleScene.cpp @@ -13,13 +13,12 @@ BadAppleScene::~BadAppleScene() { } -void BadAppleScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) { - m_renderer = renderer; - m_uiRenderer = uiRenderer; +void BadAppleScene::onEnter(CoreData* coreData) { m_coreData = coreData; - m_Width = WIDTH; - m_Height = HEIGHT; - m_cellSize = std::min(WIDTH, HEIGHT) / std::min(ROW, COL); + m_renderer = coreData->renderer; + m_Width = UI::LogicalWidth; + m_Height = UI::LogicalHeight; + m_cellSize = std::min(m_Width, m_Height) / std::min(ROW, COL); m_area = { (m_Width - m_cellSize * COL) / 2, (m_Height - m_cellSize * ROW) / 2, diff --git a/src/scenes/other/BadAppleScene.h b/src/scenes/other/BadAppleScene.h index ba7edd6..889da82 100644 --- a/src/scenes/other/BadAppleScene.h +++ b/src/scenes/other/BadAppleScene.h @@ -7,7 +7,7 @@ public: BadAppleScene(); ~BadAppleScene(); - void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) override; + void onEnter(CoreData* coreData) override; void handleClick(int logicalX, int logicalYY) override; void update() override; void renderWorld() override; // 逻辑世界 @@ -22,6 +22,7 @@ private: float m_currentTime = 0.0f; + SDL_Renderer* m_renderer; std::vector m_frame;