mirror of
https://github.com/zhenyan121/SporeBG-Conid.git
synced 2026-04-10 06:14:08 +08:00
Added MainMenuScene
This commit is contained in:
69
src/scenes/menu/MainMenuScene.cpp
Normal file
69
src/scenes/menu/MainMenuScene.cpp
Normal file
@@ -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<MainMenuUIManager>(
|
||||||
|
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);
|
||||||
|
}
|
||||||
23
src/scenes/menu/MainMenuScene.h
Normal file
23
src/scenes/menu/MainMenuScene.h
Normal file
@@ -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<MainMenuUIManager> m_mainMenuUIManager = nullptr;
|
||||||
|
void beginFrame();
|
||||||
|
void endFrame();
|
||||||
|
};
|
||||||
77
src/ui/managers/MainMenuUIManager.cpp
Normal file
77
src/ui/managers/MainMenuUIManager.cpp
Normal file
@@ -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<Button>(m_textRenderer);
|
||||||
|
button->setBackgroundColor({0, 150, 255, 255});
|
||||||
|
button->setBorder(2, {0, 0, 0, 255});
|
||||||
|
button->setPosition(650, 430);
|
||||||
|
button->setName("StartButton");
|
||||||
|
button->setText("Start Game", {"SourceHanSansSC-Regular.otf", 64, {255, 255, 255, 255}});
|
||||||
|
button->setCallback([this](){
|
||||||
|
SDL_Log("Start Game button clicked!");
|
||||||
|
m_eventCallback("GameScene");
|
||||||
|
});
|
||||||
|
m_buttons.emplace(button->getNameHash(), std::move(button));
|
||||||
|
auto label = std::make_unique<Label>();
|
||||||
|
label->setPosition(1200, 20);
|
||||||
|
label->setText("0 0", {"SourceHanSansSC-Regular.otf", 48, {0, 0, 0, 255}});
|
||||||
|
label->setName("MousePositionLabel");
|
||||||
|
m_labels.emplace(label->getNameHash(), std::move(label));
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainMenuUIManager::CollectRenderData() {
|
||||||
|
|
||||||
|
// 清理上一帧的数据
|
||||||
|
m_uiRenderData.buttons.clear();
|
||||||
|
m_uiRenderData.labels.clear();
|
||||||
|
|
||||||
|
for (auto& button : m_buttons) {
|
||||||
|
if(!button.second->isVisible()) {
|
||||||
|
continue;
|
||||||
|
|
||||||
|
}
|
||||||
|
m_uiRenderData.buttons.push_back(button.second->getButtonDate());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto& label : m_labels) {
|
||||||
|
if(!label.second->isVisible()) {
|
||||||
|
continue;
|
||||||
|
|
||||||
|
}
|
||||||
|
m_uiRenderData.labels.push_back(label.second->getLabelDate());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainMenuUIManager::UpdateMousePositon(float x, float y) {
|
||||||
|
auto logicalPos = physicalToLogical(static_cast<float>(x), static_cast<float>(y), m_renderer);
|
||||||
|
int lx = logicalPos.first;
|
||||||
|
int ly = logicalPos.second;
|
||||||
|
std::string pos = std::to_string(lx) + " " + std::to_string(ly);
|
||||||
|
|
||||||
|
m_labels[makeHash("MousePositionLabel")]->setText(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
const UIRenderData& MainMenuUIManager::getUIRenderData() {
|
||||||
|
CollectRenderData();
|
||||||
|
return m_uiRenderData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void MainMenuUIManager::handleClick(float x, float y) {
|
||||||
|
auto logicPos = physicalToLogical(x, y, m_renderer);
|
||||||
|
for (auto& buttonPair : m_buttons) {
|
||||||
|
SDL_Log("Handling click at logical position (%d, %d)\n", logicPos.first, logicPos.second);
|
||||||
|
buttonPair.second->handleCilck(logicPos.first, logicPos.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
30
src/ui/managers/MainMenuUIManager.h
Normal file
30
src/ui/managers/MainMenuUIManager.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
#pragma once
|
||||||
|
#include "ui/base/IUIManager.h"
|
||||||
|
|
||||||
|
class TextRenderer;
|
||||||
|
|
||||||
|
class MainMenuUIManager : public IUIManager {
|
||||||
|
public:
|
||||||
|
|
||||||
|
using SceneEventCallback = std::function<void(const std::string&)>;
|
||||||
|
MainMenuUIManager(SDL_Renderer* renderer,
|
||||||
|
TextRenderer* textRenderer,
|
||||||
|
SceneEventCallback eventCallback
|
||||||
|
);
|
||||||
|
~MainMenuUIManager();
|
||||||
|
|
||||||
|
void init() override;
|
||||||
|
|
||||||
|
const UIRenderData& getUIRenderData() override;
|
||||||
|
|
||||||
|
void CollectRenderData() override;
|
||||||
|
|
||||||
|
void UpdateMousePositon(float x, float y) override;
|
||||||
|
|
||||||
|
void handleClick(float x, float y);
|
||||||
|
|
||||||
|
private:
|
||||||
|
SceneEventCallback m_eventCallback;
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
Reference in New Issue
Block a user