diff --git a/CMakeLists.txt b/CMakeLists.txt index 68996b8..cd21651 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -51,6 +51,7 @@ set(SOURCE_FILES src/network/client/Client.cpp src/network/server/GameServer.cpp src/network/NetworkManager.cpp + src/graphics/texture/TextureManager.cpp ) diff --git a/src/core/GameApplication.cpp b/src/core/GameApplication.cpp index e1cd044..5b06aa0 100644 --- a/src/core/GameApplication.cpp +++ b/src/core/GameApplication.cpp @@ -53,12 +53,17 @@ bool GameApplication::initialize() { m_uiRenderer.get() ); 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_sceneManager = std::make_unique(m_windowManager->GetRenderer(), m_uiRenderer.get(), m_windowManager->GetWindow(), m_textureManager.get()); if (!m_sceneManager->initialize()) { SDL_Log("SceneManager 初始化失败!"); return false; } + + return true; } diff --git a/src/core/GameApplication.h b/src/core/GameApplication.h index 9111c04..ebdbb85 100644 --- a/src/core/GameApplication.h +++ b/src/core/GameApplication.h @@ -9,7 +9,7 @@ #include "graphics/font/TextRenderer.h" #include "graphics/font/FontManager.h" #include "core/DebugManager.h" - +#include "graphics/texture/TextureManager.h" class GameApplication { private: @@ -21,6 +21,8 @@ private: std::unique_ptr m_textRenderer; std::unique_ptr m_uiRenderer; std::unique_ptr m_debugManager; + std::unique_ptr m_textureManager; + Config m_config; void cleanup(); diff --git a/src/graphics/game/BoardRenderer.cpp b/src/graphics/game/BoardRenderer.cpp index 02cbd20..c80e46f 100644 --- a/src/graphics/game/BoardRenderer.cpp +++ b/src/graphics/game/BoardRenderer.cpp @@ -1,7 +1,13 @@ #include "BoardRenderer.h" #include "game/Board.h" #include -BoardRenderer::BoardRenderer(int WIDTH, int HEIGHT, SDL_Renderer* renderer) : m_Width(WIDTH), m_Height(HEIGHT), m_renderer(renderer) { +BoardRenderer::BoardRenderer(int WIDTH, int HEIGHT, SDL_Renderer* renderer, TextureManager* textureManager) : + m_Width(WIDTH), + m_Height(HEIGHT), + m_renderer(renderer), + m_textureManager(textureManager) + + { m_cellSize = HEIGHT / m_boardRow; } @@ -83,7 +89,7 @@ void BoardRenderer::drawPiece(std::optional> selectedPiece) } - SDL_SetRenderDrawColor(m_renderer, color.r, color.g, color.b, color.a); + //SDL_SetRenderDrawColor(m_renderer, color.r, color.g, color.b, color.a); SDL_FRect rect{ x + (area.cellSize - pieceRadius * 2) / 2.0f, @@ -92,8 +98,12 @@ void BoardRenderer::drawPiece(std::optional> selectedPiece) pieceRadius * 2 }; - SDL_RenderFillRect(m_renderer, &rect); + //SDL_RenderFillRect(m_renderer, &rect); + auto texture = m_textureManager->createTextureFromRect(rect.x, rect.y, rect, color); + SDL_FRect srect = {0, 0, rect.w, rect.h}; + SDL_RenderTexture(m_renderer, texture, &srect, &rect); + } } } diff --git a/src/graphics/game/BoardRenderer.h b/src/graphics/game/BoardRenderer.h index 648dec8..6af735b 100644 --- a/src/graphics/game/BoardRenderer.h +++ b/src/graphics/game/BoardRenderer.h @@ -5,7 +5,7 @@ #include #include #include - +#include "graphics/texture/TextureManager.h" struct PlayerColors { SDL_Color P1 = {255, 0, 0, 255}; // 红色 SDL_Color P2 = {0, 0, 255, 255}; // 蓝色 @@ -34,8 +34,10 @@ private: GameState m_gameState = GameState::GAME_RUNING; + TextureManager* m_textureManager; + public: - BoardRenderer(int WIDTH, int HEIGHT, SDL_Renderer* renderer); + BoardRenderer(int WIDTH, int HEIGHT, SDL_Renderer* renderer, TextureManager* textureManager); ~BoardRenderer(); // 渲染画面 diff --git a/src/scenes/base/Scene.h b/src/scenes/base/Scene.h index 253b429..30d5cd1 100644 --- a/src/scenes/base/Scene.h +++ b/src/scenes/base/Scene.h @@ -8,6 +8,7 @@ #include #include "graphics/ui/UIRenderer.h" #include "scenes/base/SceneEvent.h" +#include "graphics/texture/TextureManager.h" #include /** * @class Scene @@ -30,7 +31,7 @@ public: * @param height 窗口高度 * @param uiRenderer UI 渲染器指针 */ - virtual void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer){}; + virtual void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager){}; /** * @brief 场景退出 */ @@ -64,6 +65,7 @@ protected: // UIRenderer应该由上层管理 UIRenderer* m_uiRenderer; ///< UI 渲染器指针 SDL_Renderer* m_renderer; ///< SDL 渲染器指针 + TextureManager* m_textureManager; EventCallback m_eventCallback; ///< 场景事件回调函数 /*void beginFrame() { diff --git a/src/scenes/base/SceneManager.cpp b/src/scenes/base/SceneManager.cpp index 78778e7..6d99861 100644 --- a/src/scenes/base/SceneManager.cpp +++ b/src/scenes/base/SceneManager.cpp @@ -1,9 +1,10 @@ #include "SceneManager.h" #include "utils/Config.h" -SceneManager::SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window) : +SceneManager::SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager) : m_renderer(renderer), m_uiRenderer(uiRenderer), - m_window(window) + m_window(window), + m_textureManager(textureManager) { @@ -98,7 +99,7 @@ void SceneManager::pushScene(const std::string& sceneName) { - m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer); + m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager); } @@ -115,7 +116,7 @@ void SceneManager::popScene() { m_scenes.pop(); if (m_scene) { - m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer); + m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager); } } } @@ -156,7 +157,7 @@ void SceneManager::changeScene(const std::string& sceneName) { m_scene = target; - m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer); + m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager); } diff --git a/src/scenes/base/SceneManager.h b/src/scenes/base/SceneManager.h index 4d1235d..1c69589 100644 --- a/src/scenes/base/SceneManager.h +++ b/src/scenes/base/SceneManager.h @@ -31,7 +31,7 @@ public: * @param uiRenderer UI 渲染器指针,用于传递给场景进行 UI 渲染 * @param window SDL 窗口指针,用于获取窗口尺寸 */ - SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window); + SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager); /** * @brief 析构函数 * @details 清理场景栈和缓存,释放资源 @@ -126,6 +126,7 @@ 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> m_sceneCache; ///< 场景缓存,按名字缓存场景以便切换时复用 diff --git a/src/scenes/gameplay/GameScene.cpp b/src/scenes/gameplay/GameScene.cpp index 39841c2..4e8dc98 100644 --- a/src/scenes/gameplay/GameScene.cpp +++ b/src/scenes/gameplay/GameScene.cpp @@ -53,7 +53,7 @@ void GameScene::handleBoardClick(int row, int col) { m_gameSession->printBoard(); } -void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer){ +void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager){ m_renderer = renderer; m_uiRenderer = uiRenderer; @@ -64,7 +64,7 @@ void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRendere this->restartGame(); }); - m_boardRenderer = std::make_unique(WIDTH, HEIGHT, renderer); + m_boardRenderer = std::make_unique(WIDTH, HEIGHT, renderer, textureManager); m_gameSession = std::make_unique(); m_CoordinateConverter = std::make_unique(renderer); m_gameSession->initialize(); diff --git a/src/scenes/gameplay/GameScene.h b/src/scenes/gameplay/GameScene.h index 08abc14..b7932db 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) override; + void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager) override; void update() override; void renderWorld() override; // 逻辑世界 diff --git a/src/scenes/gameplay/OnlineGameScene.cpp b/src/scenes/gameplay/OnlineGameScene.cpp index c5f9ff1..4f01d45 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) { +void OnlineGameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager) { // 先创建网络管理器 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); + GameScene::onEnter(renderer, WIDTH, HEIGHT, uiRenderer, textureManager); 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 2f0d6ab..d39e791 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) override; + void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager) override; void renderWorld() override; diff --git a/src/scenes/menu/MainMenuScene.cpp b/src/scenes/menu/MainMenuScene.cpp index 990b7f6..fd83662 100644 --- a/src/scenes/menu/MainMenuScene.cpp +++ b/src/scenes/menu/MainMenuScene.cpp @@ -4,7 +4,7 @@ MainMenuScene::MainMenuScene() { // 构造函数实现 } -void MainMenuScene::onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer) { +void MainMenuScene::onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager) { // 进入场景时的初始化逻辑 m_renderer = renderer; m_uiRenderer = uiRenderer; diff --git a/src/scenes/menu/MainMenuScene.h b/src/scenes/menu/MainMenuScene.h index 5ca6483..67f892f 100644 --- a/src/scenes/menu/MainMenuScene.h +++ b/src/scenes/menu/MainMenuScene.h @@ -1,13 +1,14 @@ #pragma once #include "scenes/base/Scene.h" #include "ui/managers/MainMenuUIManager.h" +#include "graphics/texture/TextureManager.h" class MainMenuScene : public Scene { public: MainMenuScene(); ~MainMenuScene() override = default; // 实现 Scene 接口 - void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer) override; + void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager) override; void onExit() override; void update() override;