From 86d92eaf158d490820c51acd55205aaf1572a909 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Thu, 25 Dec 2025 21:32:58 +0800 Subject: [PATCH] Added QuitButton --- src/scenes/gameplay/GameScene.cpp | 9 ++++++++- src/scenes/menu/MainMenuScene.cpp | 2 -- src/ui/base/IUIManager.h | 6 +++--- src/ui/managers/GameUIManager.cpp | 17 ++++++++++++++--- src/ui/managers/GameUIManager.h | 2 +- src/ui/managers/MainMenuUIManager.cpp | 6 ++---- src/ui/managers/MainMenuUIManager.h | 7 +++---- 7 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/scenes/gameplay/GameScene.cpp b/src/scenes/gameplay/GameScene.cpp index 5dddf53..f41702e 100644 --- a/src/scenes/gameplay/GameScene.cpp +++ b/src/scenes/gameplay/GameScene.cpp @@ -11,7 +11,14 @@ GameScene::~GameScene() { void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer){ m_renderer = renderer; m_uiRenderer = uiRenderer; - m_gameUIManager = std::make_unique(renderer, uiRenderer->getTextRenderer()); + m_gameUIManager = std::make_unique( + [this](const std::string& sceneName) { + if (m_eventCallback) { + SceneEvent event{SceneEventType::ChangeScene, sceneName}; + m_eventCallback(event); + } + } + ); m_gameUIManager->init(); m_gameUIManager->setCallback([this]() { this->restartGame(); diff --git a/src/scenes/menu/MainMenuScene.cpp b/src/scenes/menu/MainMenuScene.cpp index aabec41..990b7f6 100644 --- a/src/scenes/menu/MainMenuScene.cpp +++ b/src/scenes/menu/MainMenuScene.cpp @@ -9,8 +9,6 @@ void MainMenuScene::onEnter(SDL_Renderer* renderer, int width, int height, UIRen m_renderer = renderer; m_uiRenderer = uiRenderer; m_mainMenuUIManager = std::make_unique( - renderer, - uiRenderer->getTextRenderer(), [this](const std::string& sceneName) { if (m_eventCallback) { SceneEvent event{SceneEventType::ChangeScene, sceneName}; diff --git a/src/ui/base/IUIManager.h b/src/ui/base/IUIManager.h index 58a2f46..44c7029 100644 --- a/src/ui/base/IUIManager.h +++ b/src/ui/base/IUIManager.h @@ -12,6 +12,7 @@ class IUIManager { public: + using SceneEventCallback = std::function; virtual ~IUIManager() = default; virtual void init() = 0; @@ -26,9 +27,8 @@ protected: std::unordered_map> m_buttons; std::unordered_map> m_labels; UIRenderData m_uiRenderData; - SDL_Renderer* m_renderer = nullptr; - TextRenderer* m_textRenderer = nullptr; - + + SceneEventCallback m_eventCallback; size_t makeHash(const std::string& name) { return std::hash{}(name); } diff --git a/src/ui/managers/GameUIManager.cpp b/src/ui/managers/GameUIManager.cpp index 8243eba..840a4c5 100644 --- a/src/ui/managers/GameUIManager.cpp +++ b/src/ui/managers/GameUIManager.cpp @@ -1,9 +1,8 @@ #include "GameUIManager.h" #include "ui/base/UIWidgetFactory.h" -GameUIManager::GameUIManager(SDL_Renderer* renderer, TextRenderer* textRenderer) +GameUIManager::GameUIManager(SceneEventCallback eventCallback) { - m_renderer = renderer; - m_textRenderer = textRenderer; + m_eventCallback = eventCallback; } GameUIManager::~GameUIManager() { @@ -145,6 +144,18 @@ void GameUIManager::setupUIComponents() { restartButton->setVisible(false); // 初始时隐藏 restartButton->setEnabled(false); m_buttons.emplace(restartButton->getNameHash(), std::move(restartButton)); + + auto QuitButton = UIWidgetFactory::createStandardButton( + "QuitButton", + "Quit", + 550, + 20, + [this](){ + m_eventCallback("MainMenuScene"); + } + + ); + m_buttons.emplace(QuitButton->getNameHash(), std::move(QuitButton)); } diff --git a/src/ui/managers/GameUIManager.h b/src/ui/managers/GameUIManager.h index 100c946..5f17f43 100644 --- a/src/ui/managers/GameUIManager.h +++ b/src/ui/managers/GameUIManager.h @@ -4,7 +4,7 @@ #include class GameUIManager : public IUIManager { public: - GameUIManager(SDL_Renderer* renderer, TextRenderer* textRenderer); + GameUIManager(SceneEventCallback eventCallback); ~GameUIManager(); diff --git a/src/ui/managers/MainMenuUIManager.cpp b/src/ui/managers/MainMenuUIManager.cpp index b675594..4715c82 100644 --- a/src/ui/managers/MainMenuUIManager.cpp +++ b/src/ui/managers/MainMenuUIManager.cpp @@ -1,11 +1,9 @@ #include "MainMenuUIManager.h" #include "ui/base/UIWidgetFactory.h" -MainMenuUIManager::MainMenuUIManager(SDL_Renderer* renderer, - TextRenderer* textRenderer, +MainMenuUIManager::MainMenuUIManager( SceneEventCallback eventCallback) { - m_renderer = renderer; - m_textRenderer = textRenderer; + m_eventCallback = eventCallback; } diff --git a/src/ui/managers/MainMenuUIManager.h b/src/ui/managers/MainMenuUIManager.h index d4e446b..fd0a41e 100644 --- a/src/ui/managers/MainMenuUIManager.h +++ b/src/ui/managers/MainMenuUIManager.h @@ -6,9 +6,8 @@ class TextRenderer; class MainMenuUIManager : public IUIManager { public: - using SceneEventCallback = std::function; - MainMenuUIManager(SDL_Renderer* renderer, - TextRenderer* textRenderer, + + MainMenuUIManager( SceneEventCallback eventCallback ); ~MainMenuUIManager(); @@ -24,7 +23,7 @@ public: void handleClick(int logicalX, int logicalY); private: - SceneEventCallback m_eventCallback; + }; \ No newline at end of file