refactor: improve scene onEnter logic

This commit is contained in:
2026-02-13 20:59:46 +08:00
parent bdcaa8547d
commit 6a24decd17
13 changed files with 39 additions and 41 deletions

View File

@@ -3,8 +3,15 @@
#include "ui/managers/debug/DebugData.h" #include "ui/managers/debug/DebugData.h"
#include "input/InputState.h" #include "input/InputState.h"
#include "scenes/base/SceneEvent.h" #include "scenes/base/SceneEvent.h"
#include "graphics/ui/UIRenderer.h"
#include "graphics/texture/TextureManager.h"
struct CoreData { struct CoreData {
DebugData debugData; DebugData debugData;
InputState inputState; InputState inputState;
SceneType sceneType = SceneType::MainMenuScene; SceneType sceneType = SceneType::MainMenuScene;
SDL_Renderer* renderer = nullptr;
UIRenderer* uiRenderer = nullptr;
SDL_Window* window = nullptr;
TextureManager* textureManager = nullptr;
}; };

View File

@@ -57,8 +57,13 @@ bool GameApplication::initialize() {
// 材质管理 // 材质管理
m_textureManager = std::make_unique<TextureManager>(m_windowManager->GetRenderer()); m_textureManager = std::make_unique<TextureManager>(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 能获取窗口尺寸 // 场景管理,传入窗口句柄以便 SceneManager 能获取窗口尺寸
m_sceneManager = std::make_unique<SceneManager>(m_windowManager->GetRenderer(), m_uiRenderer.get(), m_windowManager->GetWindow(), m_textureManager.get(), m_coreData); m_sceneManager = std::make_unique<SceneManager>(m_coreData);
if (!m_sceneManager->initialize()) { if (!m_sceneManager->initialize()) {
SDL_Log("SceneManager 初始化失败!"); SDL_Log("SceneManager 初始化失败!");
return false; return false;

View File

@@ -33,7 +33,7 @@ public:
* @param height 窗口高度 * @param height 窗口高度
* @param uiRenderer UI 渲染器指针 * @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 场景退出 * @brief 场景退出
*/ */
@@ -64,10 +64,6 @@ public:
m_eventCallback = std::move(callback); m_eventCallback = std::move(callback);
} }
protected: protected:
// UIRenderer应该由上层管理
UIRenderer* m_uiRenderer; ///< UI 渲染器指针
SDL_Renderer* m_renderer; ///< SDL 渲染器指针
TextureManager* m_textureManager;
EventCallback m_eventCallback; ///< 场景事件回调函数 EventCallback m_eventCallback; ///< 场景事件回调函数
CoreData* m_coreData; CoreData* m_coreData;
/*void beginFrame() { /*void beginFrame() {

View File

@@ -1,10 +1,6 @@
#include "SceneManager.h" #include "SceneManager.h"
#include "utils/Config.h" #include "utils/Config.h"
SceneManager::SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager, CoreData& coreData) : SceneManager::SceneManager(CoreData& coreData) :
m_renderer(renderer),
m_uiRenderer(uiRenderer),
m_window(window),
m_textureManager(textureManager),
m_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(); m_scenes.pop();
if (m_scene) { 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_coreData.sceneType = sceneType;
m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager, &m_coreData); m_scene->onEnter(&m_coreData);
} }

View File

@@ -33,7 +33,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, TextureManager* textureManager, CoreData& coreData); SceneManager(CoreData& coreData);
/** /**
* @brief 析构函数 * @brief 析构函数
* @details 清理场景栈和缓存,释放资源 * @details 清理场景栈和缓存,释放资源
@@ -125,10 +125,6 @@ public:
void destoryQuitedScene(); void destoryQuitedScene();
private: private:
SDL_Renderer* m_renderer; ///< SDL 渲染器指针
SDL_Window* m_window; ///< SDL 窗口指针
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<SceneType, std::shared_ptr<Scene>, SceneTypeHash> m_sceneCache; ///< 场景缓存,按名字缓存场景以便切换时复用 std::unordered_map<SceneType, std::shared_ptr<Scene>, SceneTypeHash> m_sceneCache; ///< 场景缓存,按名字缓存场景以便切换时复用

View File

@@ -54,9 +54,9 @@ 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, TextureManager* textureManager, CoreData* coreData){ void GameScene::onEnter(CoreData* coreData){
m_renderer = renderer; coreData->renderer;
m_uiRenderer = uiRenderer; coreData->uiRenderer;
m_coreData = coreData; m_coreData = coreData;
// 使用工厂方法创建UIManager // 使用工厂方法创建UIManager
m_gameUIManager = createUIManager(); m_gameUIManager = createUIManager();
@@ -65,9 +65,9 @@ void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRendere
this->restartGame(); this->restartGame();
}); });
m_boardRenderer = std::make_unique<BoardRenderer>(WIDTH, HEIGHT, renderer, textureManager); m_boardRenderer = std::make_unique<BoardRenderer>(UI::LogicalWidth, UI::LogicalHeight, coreData->renderer, coreData->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>(coreData->renderer);
m_gameSession->initialize(); m_gameSession->initialize();
m_boardRenderer->setBoard(m_gameSession->getBoard()); m_boardRenderer->setBoard(m_gameSession->getBoard());
@@ -100,7 +100,7 @@ void GameScene::renderWorld() {
} }
void GameScene::renderUI() { void GameScene::renderUI() {
m_uiRenderer->renderUI(m_gameUIManager->getUIRenderData()); m_coreData->uiRenderer->renderUI(m_gameUIManager->getUIRenderData());
} }
void GameScene::handleClick(int logicalX, int logicalY) { void GameScene::handleClick(int logicalX, int logicalY) {

View File

@@ -11,7 +11,7 @@ public:
GameScene(); GameScene();
~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 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, TextureManager* textureManager, CoreData* coreData) { void OnlineGameScene::onEnter(CoreData* coreData) {
// 先创建网络管理器 // 先创建网络管理器
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, textureManager, coreData); GameScene::onEnter(coreData);
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, TextureManager* textureManager, CoreData* coreData) override; void onEnter(CoreData* coreData) override;
void renderWorld() override; void renderWorld() override;

View File

@@ -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_coreData = coreData;
m_mainMenuUIManager = std::make_unique<MainMenuUIManager>( m_mainMenuUIManager = std::make_unique<MainMenuUIManager>(
[this](SceneType sceneType) { [this](SceneType sceneType) {
@@ -40,7 +38,7 @@ void MainMenuScene::renderWorld() {
void MainMenuScene::renderUI() { void MainMenuScene::renderUI() {
const UIRenderData& uiRenderData = m_mainMenuUIManager->getUIRenderData(); const UIRenderData& uiRenderData = m_mainMenuUIManager->getUIRenderData();
m_uiRenderer->renderUI(uiRenderData); m_coreData->uiRenderer->renderUI(uiRenderData);
} }
void MainMenuScene::handleClick(int logicalX, int logicalY) { void MainMenuScene::handleClick(int logicalX, int logicalY) {

View File

@@ -8,7 +8,7 @@ public:
~MainMenuScene() override = default; ~MainMenuScene() override = default;
// 实现 Scene 接口 // 实现 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 onExit() override;
void update() override; void update() override;

View File

@@ -13,13 +13,12 @@ BadAppleScene::~BadAppleScene() {
} }
void BadAppleScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) { void BadAppleScene::onEnter(CoreData* coreData) {
m_renderer = renderer;
m_uiRenderer = uiRenderer;
m_coreData = coreData; m_coreData = coreData;
m_Width = WIDTH; m_renderer = coreData->renderer;
m_Height = HEIGHT; m_Width = UI::LogicalWidth;
m_cellSize = std::min(WIDTH, HEIGHT) / std::min(ROW, COL); m_Height = UI::LogicalHeight;
m_cellSize = std::min(m_Width, m_Height) / std::min(ROW, COL);
m_area = { m_area = {
(m_Width - m_cellSize * COL) / 2, (m_Width - m_cellSize * COL) / 2,
(m_Height - m_cellSize * ROW) / 2, (m_Height - m_cellSize * ROW) / 2,

View File

@@ -7,7 +7,7 @@ public:
BadAppleScene(); BadAppleScene();
~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 handleClick(int logicalX, int logicalYY) override;
void update() override; void update() override;
void renderWorld() override; // 逻辑世界 void renderWorld() override; // 逻辑世界
@@ -22,6 +22,7 @@ private:
float m_currentTime = 0.0f; float m_currentTime = 0.0f;
SDL_Renderer* m_renderer;
std::vector<std::string> m_frame; std::vector<std::string> m_frame;