feat: add round display

This commit is contained in:
2026-02-04 20:01:36 +08:00
parent ac58e1bfb7
commit 7db7697625
18 changed files with 71 additions and 26 deletions

7
src/core/CoreData.h Normal file
View File

@@ -0,0 +1,7 @@
#pragma once
#include "ui/managers/debug/DebugData.h"
struct CoreData {
DebugData debugData;
};

View File

@@ -5,12 +5,14 @@ DebugManager::DebugManager(
const SDL_Renderer* renderer, const SDL_Renderer* renderer,
const SDL_Window* window, const SDL_Window* window,
//const InputState& inputState, //const InputState& inputState,
UIRenderer* uiRenderer UIRenderer* uiRenderer,
DebugData& debugData
): ):
m_renderer(renderer), m_renderer(renderer),
m_window(window), m_window(window),
//m_inputState(inputState), //m_inputState(inputState),
m_uiRenderer(uiRenderer) m_uiRenderer(uiRenderer),
m_debugData(debugData)
{ {
} }

View File

@@ -10,7 +10,8 @@ public:
const SDL_Renderer* renderer, const SDL_Renderer* renderer,
const SDL_Window* window, const SDL_Window* window,
//const InputState& inputState, //const InputState& inputState,
UIRenderer* uiRenderer UIRenderer* uiRenderer,
DebugData& debugData
); );
~DebugManager(); ~DebugManager();
@@ -22,9 +23,13 @@ public:
void updateMousePos(int logicalX, int logicalY, const InputState& inputState); void updateMousePos(int logicalX, int logicalY, const InputState& inputState);
void updateDebugInfo(); void updateDebugInfo();
DebugData& getDebugData() {
return m_debugData;
}
private: private:
std::unique_ptr<DebugOverlay> m_debugOverlay; std::unique_ptr<DebugOverlay> m_debugOverlay;
DebugData m_debugData; DebugData& m_debugData;
const SDL_Renderer* m_renderer = nullptr; const SDL_Renderer* m_renderer = nullptr;
const SDL_Window* m_window = nullptr; const SDL_Window* m_window = nullptr;
//const InputState& m_inputState; //const InputState& m_inputState;

View File

@@ -50,14 +50,15 @@ bool GameApplication::initialize() {
m_windowManager->GetRenderer(), m_windowManager->GetRenderer(),
m_windowManager->GetWindow(), m_windowManager->GetWindow(),
//m_inputManager->GetInputState(), //m_inputManager->GetInputState(),
m_uiRenderer.get() m_uiRenderer.get(),
m_coreData.debugData
); );
m_debugManager->initialize(); m_debugManager->initialize();
// 材质管理 // 材质管理
m_textureManager = std::make_unique<TextureManager>(m_windowManager->GetRenderer()); 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_textureManager.get()); m_sceneManager = std::make_unique<SceneManager>(m_windowManager->GetRenderer(), m_uiRenderer.get(), m_windowManager->GetWindow(), m_textureManager.get(), m_coreData);
if (!m_sceneManager->initialize()) { if (!m_sceneManager->initialize()) {
SDL_Log("SceneManager 初始化失败!"); SDL_Log("SceneManager 初始化失败!");
return false; return false;

View File

@@ -10,6 +10,8 @@
#include "graphics/font/FontManager.h" #include "graphics/font/FontManager.h"
#include "core/DebugManager.h" #include "core/DebugManager.h"
#include "graphics/texture/TextureManager.h" #include "graphics/texture/TextureManager.h"
#include "CoreData.h"
class GameApplication { class GameApplication {
private: private:
@@ -26,6 +28,8 @@ private:
Config m_config; Config m_config;
void cleanup(); void cleanup();
CoreData m_coreData;
public: public:
GameApplication(); GameApplication();
~GameApplication(); ~GameApplication();

View File

@@ -159,8 +159,8 @@ void GameSession::nextTurn() {
m_currentActionType = ActionType::GROW; m_currentActionType = ActionType::GROW;
if (m_currentPlayer == PlayerID::P1) { if (m_currentPlayer == PlayerID::P1) {
GameRounds++; m_gameRound++;
std::cout << "GameSession: Current Round is " << GameRounds << "\n"; std::cout << "GameSession: Current Round is " << m_gameRound << "\n";
} }
// 回合结束增加生命值 // 回合结束增加生命值

View File

@@ -27,7 +27,7 @@ private:
GamePieceEventCallback m_gamePieceEventCallback; GamePieceEventCallback m_gamePieceEventCallback;
int GameRounds = 1; int m_gameRound = 1;
@@ -70,6 +70,8 @@ public:
m_gamePieceEventCallback = callback; m_gamePieceEventCallback = callback;
} }
int getRound() {
return m_gameRound;
}
}; };

View File

@@ -9,6 +9,7 @@
#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 "graphics/texture/TextureManager.h"
#include "core/CoreData.h"
#include <functional> #include <functional>
/** /**
* @class Scene * @class Scene
@@ -31,7 +32,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){}; virtual void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* CoreData){};
/** /**
* @brief 场景退出 * @brief 场景退出
*/ */
@@ -67,7 +68,7 @@ protected:
SDL_Renderer* m_renderer; ///< SDL 渲染器指针 SDL_Renderer* m_renderer; ///< SDL 渲染器指针
TextureManager* m_textureManager; TextureManager* m_textureManager;
EventCallback m_eventCallback; ///< 场景事件回调函数 EventCallback m_eventCallback; ///< 场景事件回调函数
CoreData* m_coreData;
/*void beginFrame() { /*void beginFrame() {
if (!m_renderer) { if (!m_renderer) {
SDL_Log("Renderer is null in beginFrame!"); SDL_Log("Renderer is null in beginFrame!");

View File

@@ -1,10 +1,11 @@
#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) : SceneManager::SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager, CoreData& coreData) :
m_renderer(renderer), m_renderer(renderer),
m_uiRenderer(uiRenderer), m_uiRenderer(uiRenderer),
m_window(window), m_window(window),
m_textureManager(textureManager) m_textureManager(textureManager),
m_coreData(coreData)
{ {
@@ -99,7 +100,7 @@ void SceneManager::pushScene(const std::string& sceneName) {
m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager); m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager, &m_coreData);
} }
@@ -116,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_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager, &m_coreData);
} }
} }
} }
@@ -157,7 +158,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_textureManager); m_scene->onEnter(m_renderer, UI::LogicalWidth, UI::LogicalHeight, m_uiRenderer, m_textureManager, &m_coreData);
} }

View File

@@ -10,6 +10,7 @@
#include "scenes/gameplay/GameScene.h" #include "scenes/gameplay/GameScene.h"
#include "scenes/menu/MainMenuScene.h" #include "scenes/menu/MainMenuScene.h"
#include "scenes/gameplay/OnlineGameScene.h" #include "scenes/gameplay/OnlineGameScene.h"
#include "core/CoreData.h"
#include <SDL3/SDL.h> #include <SDL3/SDL.h>
#include <string> #include <string>
#include <stack> #include <stack>
@@ -31,7 +32,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); SceneManager(SDL_Renderer* renderer, UIRenderer* uiRenderer, SDL_Window* window, TextureManager* textureManager, CoreData& coreData);
/** /**
* @brief 析构函数 * @brief 析构函数
* @details 清理场景栈和缓存,释放资源 * @details 清理场景栈和缓存,释放资源
@@ -137,5 +138,7 @@ private:
* @return 返回 {宽度, 高度},如果获取失败则返回默认值 {1600, 900} * @return 返回 {宽度, 高度},如果获取失败则返回默认值 {1600, 900}
*/ */
//std::pair<int, int> getWindowDimensions() const; //std::pair<int, int> getWindowDimensions() const;
CoreData& m_coreData;
}; };

View File

@@ -53,10 +53,10 @@ 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){ void GameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData){
m_renderer = renderer; m_renderer = renderer;
m_uiRenderer = uiRenderer; m_uiRenderer = uiRenderer;
m_coreData = coreData;
// 使用工厂方法创建UIManager // 使用工厂方法创建UIManager
m_gameUIManager = createUIManager(); m_gameUIManager = createUIManager();
m_gameUIManager->init(); m_gameUIManager->init();
@@ -129,6 +129,7 @@ void GameScene::handleClick(int logicalX, int logicalY) {
} else { } else {
SDL_Log("invail cilck aera!"); SDL_Log("invail cilck aera!");
} }
m_coreData->debugData.round = m_gameSession->getRound();
} }

View File

@@ -11,7 +11,7 @@ public:
GameScene(); GameScene();
~GameScene(); ~GameScene();
void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager) override; void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, 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) { void OnlineGameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, 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); GameScene::onEnter(renderer, WIDTH, HEIGHT, uiRenderer, textureManager, 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) override; void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) override;
void renderWorld() override; void renderWorld() override;

View File

@@ -4,10 +4,11 @@ MainMenuScene::MainMenuScene() {
// 构造函数实现 // 构造函数实现
} }
void MainMenuScene::onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager) { void MainMenuScene::onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) {
// 进入场景时的初始化逻辑 // 进入场景时的初始化逻辑
m_renderer = renderer; m_renderer = renderer;
m_uiRenderer = uiRenderer; m_uiRenderer = uiRenderer;
m_coreData = coreData;
m_mainMenuUIManager = std::make_unique<MainMenuUIManager>( m_mainMenuUIManager = std::make_unique<MainMenuUIManager>(
[this](const std::string& sceneName) { [this](const std::string& sceneName) {
if (m_eventCallback) { if (m_eventCallback) {

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) override; void onEnter(SDL_Renderer* renderer, int width, int height, UIRenderer* uiRenderer, TextureManager* textureManager, CoreData* coreData) override;
void onExit() override; void onExit() override;
void update() override; void update() override;

View File

@@ -9,5 +9,6 @@ struct DebugData {
std::pair<int, int> mousePosition = {0, 0}; std::pair<int, int> mousePosition = {0, 0};
std::pair<int, int> mouseLogicalPostion = {0, 0}; std::pair<int, int> mouseLogicalPostion = {0, 0};
int currentFPS = 0; int currentFPS = 0;
int round = 0;
}; };

View File

@@ -34,6 +34,14 @@ void DebugOverlay::initialize() {
80 80
); );
m_labels.emplace(mouseLogicalPos->getNameHash(), std::move(mouseLogicalPos)); m_labels.emplace(mouseLogicalPos->getNameHash(), std::move(mouseLogicalPos));
auto roundLabel = UIWidgetFactory::createStandardLabel(
"RoundLabel",
"Round: 0",
0,
120
);
m_labels.emplace(roundLabel->getNameHash(), std::move(roundLabel));
} }
@@ -125,4 +133,12 @@ void DebugOverlay::updateDebugInfo() {
} else { } else {
std::cerr << "Mouse LogicalPosition Label not found!\n"; std::cerr << "Mouse LogicalPosition Label not found!\n";
} }
const auto roundLabelKey = makeHash("RoundLabel");
auto roundLabel = m_labels.find(roundLabelKey);
if (roundLabel != m_labels.end()) {
roundLabel->second->setText("Round: " + std::to_string(m_debugData.round));
} else {
std::cerr << "Round Label not found!\n";
}
} }