refactor: switch piece rendering from direct draws to texture system

This commit is contained in:
2026-01-15 16:43:17 +08:00
parent cddf8d5e0b
commit d65d4241f4
14 changed files with 47 additions and 22 deletions

View File

@@ -51,6 +51,7 @@ set(SOURCE_FILES
src/network/client/Client.cpp src/network/client/Client.cpp
src/network/server/GameServer.cpp src/network/server/GameServer.cpp
src/network/NetworkManager.cpp src/network/NetworkManager.cpp
src/graphics/texture/TextureManager.cpp
) )

View File

@@ -53,12 +53,17 @@ bool GameApplication::initialize() {
m_uiRenderer.get() m_uiRenderer.get()
); );
m_debugManager->initialize(); m_debugManager->initialize();
// 材质管理
m_textureManager = std::make_unique<TextureManager>(m_windowManager->GetRenderer());
// 场景管理,传入窗口句柄以便 SceneManager 能获取窗口尺寸 // 场景管理,传入窗口句柄以便 SceneManager 能获取窗口尺寸
m_sceneManager = std::make_unique<SceneManager>(m_windowManager->GetRenderer(), m_uiRenderer.get(), m_windowManager->GetWindow()); m_sceneManager = std::make_unique<SceneManager>(m_windowManager->GetRenderer(), m_uiRenderer.get(), m_windowManager->GetWindow(), m_textureManager.get());
if (!m_sceneManager->initialize()) { if (!m_sceneManager->initialize()) {
SDL_Log("SceneManager 初始化失败!"); SDL_Log("SceneManager 初始化失败!");
return false; return false;
} }
return true; return true;
} }

View File

@@ -9,7 +9,7 @@
#include "graphics/font/TextRenderer.h" #include "graphics/font/TextRenderer.h"
#include "graphics/font/FontManager.h" #include "graphics/font/FontManager.h"
#include "core/DebugManager.h" #include "core/DebugManager.h"
#include "graphics/texture/TextureManager.h"
class GameApplication { class GameApplication {
private: private:
@@ -21,6 +21,8 @@ private:
std::unique_ptr<TextRenderer> m_textRenderer; std::unique_ptr<TextRenderer> m_textRenderer;
std::unique_ptr<UIRenderer> m_uiRenderer; std::unique_ptr<UIRenderer> m_uiRenderer;
std::unique_ptr<DebugManager> m_debugManager; std::unique_ptr<DebugManager> m_debugManager;
std::unique_ptr<TextureManager> m_textureManager;
Config m_config; Config m_config;
void cleanup(); void cleanup();

View File

@@ -1,7 +1,13 @@
#include "BoardRenderer.h" #include "BoardRenderer.h"
#include "game/Board.h" #include "game/Board.h"
#include <iostream> #include <iostream>
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; m_cellSize = HEIGHT / m_boardRow;
} }
@@ -83,7 +89,7 @@ void BoardRenderer::drawPiece(std::optional<std::pair<int, int>> 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{ SDL_FRect rect{
x + (area.cellSize - pieceRadius * 2) / 2.0f, x + (area.cellSize - pieceRadius * 2) / 2.0f,
@@ -92,8 +98,12 @@ void BoardRenderer::drawPiece(std::optional<std::pair<int, int>> selectedPiece)
pieceRadius * 2 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);
} }
} }
} }

View File

@@ -5,7 +5,7 @@
#include <optional> #include <optional>
#include <utility> #include <utility>
#include <unordered_set> #include <unordered_set>
#include "graphics/texture/TextureManager.h"
struct PlayerColors { struct PlayerColors {
SDL_Color P1 = {255, 0, 0, 255}; // 红色 SDL_Color P1 = {255, 0, 0, 255}; // 红色
SDL_Color P2 = {0, 0, 255, 255}; // 蓝色 SDL_Color P2 = {0, 0, 255, 255}; // 蓝色
@@ -34,8 +34,10 @@ private:
GameState m_gameState = GameState::GAME_RUNING; GameState m_gameState = GameState::GAME_RUNING;
TextureManager* m_textureManager;
public: public:
BoardRenderer(int WIDTH, int HEIGHT, SDL_Renderer* renderer); BoardRenderer(int WIDTH, int HEIGHT, SDL_Renderer* renderer, TextureManager* textureManager);
~BoardRenderer(); ~BoardRenderer();
// 渲染画面 // 渲染画面

View File

@@ -8,6 +8,7 @@
#include <SDL3/SDL.h> #include <SDL3/SDL.h>
#include "graphics/ui/UIRenderer.h" #include "graphics/ui/UIRenderer.h"
#include "scenes/base/SceneEvent.h" #include "scenes/base/SceneEvent.h"
#include "graphics/texture/TextureManager.h"
#include <functional> #include <functional>
/** /**
* @class Scene * @class Scene
@@ -30,7 +31,7 @@ public:
* @param height 窗口高度 * @param height 窗口高度
* @param uiRenderer UI 渲染器指针 * @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 场景退出 * @brief 场景退出
*/ */
@@ -64,6 +65,7 @@ protected:
// UIRenderer应该由上层管理 // UIRenderer应该由上层管理
UIRenderer* m_uiRenderer; ///< UI 渲染器指针 UIRenderer* m_uiRenderer; ///< UI 渲染器指针
SDL_Renderer* m_renderer; ///< SDL 渲染器指针 SDL_Renderer* m_renderer; ///< SDL 渲染器指针
TextureManager* m_textureManager;
EventCallback m_eventCallback; ///< 场景事件回调函数 EventCallback m_eventCallback; ///< 场景事件回调函数
/*void beginFrame() { /*void beginFrame() {

View File

@@ -1,9 +1,10 @@
#include "SceneManager.h" #include "SceneManager.h"
#include "utils/Config.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_renderer(renderer),
m_uiRenderer(uiRenderer), 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(); m_scenes.pop();
if (m_scene) { 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 = 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);
} }

View File

@@ -31,7 +31,7 @@ public:
* @param uiRenderer UI 渲染器指针,用于传递给场景进行 UI 渲染 * @param uiRenderer UI 渲染器指针,用于传递给场景进行 UI 渲染
* @param window SDL 窗口指针,用于获取窗口尺寸 * @param window SDL 窗口指针,用于获取窗口尺寸
*/ */
SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window); SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager);
/** /**
* @brief 析构函数 * @brief 析构函数
* @details 清理场景栈和缓存,释放资源 * @details 清理场景栈和缓存,释放资源
@@ -126,6 +126,7 @@ private:
SDL_Renderer* m_renderer; ///< SDL 渲染器指针 SDL_Renderer* m_renderer; ///< SDL 渲染器指针
SDL_Window* m_window; ///< SDL 窗口指针 SDL_Window* m_window; ///< SDL 窗口指针
UIRenderer* m_uiRenderer; ///< UI 渲染器指针 UIRenderer* m_uiRenderer; ///< UI 渲染器指针
TextureManager* m_textureManager; ///< 材质管理器指针
std::shared_ptr<Scene> m_scene; ///< 当前场景(使用 shared_ptr 便于在缓存和栈中共享) std::shared_ptr<Scene> m_scene; ///< 当前场景(使用 shared_ptr 便于在缓存和栈中共享)
std::stack<std::shared_ptr<Scene>> m_scenes; ///< 场景栈,存储场景层级关系(使用 shared_ptr std::stack<std::shared_ptr<Scene>> m_scenes; ///< 场景栈,存储场景层级关系(使用 shared_ptr
std::unordered_map<std::string, std::shared_ptr<Scene>> m_sceneCache; ///< 场景缓存,按名字缓存场景以便切换时复用 std::unordered_map<std::string, std::shared_ptr<Scene>> m_sceneCache; ///< 场景缓存,按名字缓存场景以便切换时复用

View File

@@ -53,7 +53,7 @@ void GameScene::handleBoardClick(int row, int col) {
m_gameSession->printBoard(); 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_renderer = renderer;
m_uiRenderer = uiRenderer; m_uiRenderer = uiRenderer;
@@ -64,7 +64,7 @@ void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRendere
this->restartGame(); this->restartGame();
}); });
m_boardRenderer = std::make_unique<BoardRenderer>(WIDTH, HEIGHT, renderer); m_boardRenderer = std::make_unique<BoardRenderer>(WIDTH, HEIGHT, renderer, textureManager);
m_gameSession = std::make_unique<GameSession>(); m_gameSession = std::make_unique<GameSession>();
m_CoordinateConverter = std::make_unique<CoordinateConverter>(renderer); m_CoordinateConverter = std::make_unique<CoordinateConverter>(renderer);
m_gameSession->initialize(); m_gameSession->initialize();

View File

@@ -11,7 +11,7 @@ public:
GameScene(); GameScene();
~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 update() override;
void renderWorld() override; // 逻辑世界 void renderWorld() override; // 逻辑世界

View File

@@ -37,7 +37,7 @@ std::unique_ptr<GameUIManager> OnlineGameScene::createUIManager() {
return onlineUIManager; 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<NetworkManager>(); m_networkManager = std::make_unique<NetworkManager>();
m_networkManager->setClickEventCallback( m_networkManager->setClickEventCallback(
@@ -58,7 +58,7 @@ void OnlineGameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIR
} }
); );
// 调用父类的onEnter会调用我们重写的createUIManager // 调用父类的onEnter会调用我们重写的createUIManager
GameScene::onEnter(renderer, WIDTH, HEIGHT, uiRenderer); GameScene::onEnter(renderer, WIDTH, HEIGHT, uiRenderer, textureManager);
m_gameUIManager->setButton("ActionButton", false); // 初始禁用行动按钮,等待游戏开始 m_gameUIManager->setButton("ActionButton", false); // 初始禁用行动按钮,等待游戏开始
m_gameUIManager->setLabel("PlayerLabel", false); // 初始隐藏玩家回合标签 m_gameUIManager->setLabel("PlayerLabel", false); // 初始隐藏玩家回合标签

View File

@@ -5,7 +5,7 @@
class OnlineGameScene : public GameScene { class OnlineGameScene : public GameScene {
public: 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; void renderWorld() override;

View File

@@ -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_renderer = renderer;
m_uiRenderer = uiRenderer; m_uiRenderer = uiRenderer;

View File

@@ -1,13 +1,14 @@
#pragma once #pragma once
#include "scenes/base/Scene.h" #include "scenes/base/Scene.h"
#include "ui/managers/MainMenuUIManager.h" #include "ui/managers/MainMenuUIManager.h"
#include "graphics/texture/TextureManager.h"
class MainMenuScene : public Scene { class MainMenuScene : public Scene {
public: public:
MainMenuScene(); MainMenuScene();
~MainMenuScene() override = default; ~MainMenuScene() override = default;
// 实现 Scene 接口 // 实现 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 onExit() override;
void update() override; void update() override;