mirror of
https://github.com/zhenyan121/SporeBG-Conid.git
synced 2026-04-10 06:14:08 +08:00
refactor: switch piece rendering from direct draws to texture system
This commit is contained in:
@@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
// 渲染画面
|
// 渲染画面
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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; ///< 场景缓存,按名字缓存场景以便切换时复用
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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; // 逻辑世界
|
||||||
|
|||||||
@@ -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); // 初始隐藏玩家回合标签
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user