diff --git a/src/scenes/menu/MainMenuScene.cpp b/src/scenes/menu/MainMenuScene.cpp new file mode 100644 index 0000000..242cc33 --- /dev/null +++ b/src/scenes/menu/MainMenuScene.cpp @@ -0,0 +1,69 @@ +#include "MainMenuScene.h" + +MainMenuScene::MainMenuScene() { + // 构造函数实现 +} + +void MainMenuScene::onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer) { + // 进入场景时的初始化逻辑 + 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}; + m_eventCallback(event); + } + } + ); + m_mainMenuUIManager->init(); +} + +void MainMenuScene::onExit() { + // 退出场景时的清理逻辑 + m_mainMenuUIManager.reset(); +} + +void MainMenuScene::update() { + // 更新场景逻辑 +} + +void MainMenuScene::render() { + beginFrame(); + // 渲染场景内容 + const UIRenderData& uiRenderData = m_mainMenuUIManager->getUIRenderData(); + m_uiRenderer->renderUI(uiRenderData); + endFrame(); +} + +void MainMenuScene::handleClick(float x, float y) { + // 处理点击事件 + m_mainMenuUIManager->handleClick(x, y); +} + +void MainMenuScene::beginFrame() { + // 开始帧渲染的逻辑 + if (!m_renderer) { + SDL_Log("ERROR: Renderer is NULL!\n"); + return; + } + // 清屏为白色色背景 + SDL_SetRenderDrawColor(m_renderer, 255, 255, 255, 255); + SDL_RenderClear(m_renderer); + //std::cout << "begin frame\n"; + + +} + +void MainMenuScene::endFrame() { + // 结束帧渲染的逻辑 + // 提交到屏幕 + //std::cout << "end frame\n"; + SDL_RenderPresent(m_renderer); +} + +void MainMenuScene::renderMousePosition(float x, float y) { + m_mainMenuUIManager->UpdateMousePositon(x, y); +} \ No newline at end of file diff --git a/src/scenes/menu/MainMenuScene.h b/src/scenes/menu/MainMenuScene.h new file mode 100644 index 0000000..9fb8233 --- /dev/null +++ b/src/scenes/menu/MainMenuScene.h @@ -0,0 +1,23 @@ +#pragma once +#include "scenes/base/Scene.h" +#include "ui/managers/MainMenuUIManager.h" +class MainMenuScene : public Scene { +public: + MainMenuScene(); + ~MainMenuScene() override = default; + + // 实现 Scene 接口 + void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer) override; + void onExit() override; + + void update() override; + void render() override; + void handleClick(float x, float y) override; + + void renderMousePosition(float x, float y) override; +private: + // 其他私有成员变量和方法 + std::unique_ptr m_mainMenuUIManager = nullptr; + void beginFrame(); + void endFrame(); +}; \ No newline at end of file diff --git a/src/ui/managers/MainMenuUIManager.cpp b/src/ui/managers/MainMenuUIManager.cpp new file mode 100644 index 0000000..85ff28f --- /dev/null +++ b/src/ui/managers/MainMenuUIManager.cpp @@ -0,0 +1,77 @@ +#include "MainMenuUIManager.h" +#include "utils/CoordinateTools.h" +MainMenuUIManager::MainMenuUIManager(SDL_Renderer* renderer, + TextRenderer* textRenderer, + SceneEventCallback eventCallback) { + m_renderer = renderer; + m_textRenderer = textRenderer; + m_eventCallback = eventCallback; +} + +MainMenuUIManager::~MainMenuUIManager() { + +} + +void MainMenuUIManager::init() { + auto button = std::make_unique