Added OnlineGameScene and OnlineGameUIManager class

This commit is contained in:
2025-12-27 20:16:06 +08:00
parent 585c18d56a
commit 4f058ae768
11 changed files with 144 additions and 8 deletions

View File

@@ -1,12 +1,16 @@
#include "GameApplication.h"
#include "utils/Tools.h"
#include "Time.h"
GameApplication::GameApplication() {
GameApplication::GameApplication()
{
}
GameApplication::~GameApplication() {
}
bool GameApplication::initialize() {
@@ -23,6 +27,9 @@ bool GameApplication::initialize() {
SDL_Log("无法加载json");
}
Time::init();
// 输入管理
m_inputManager = std::make_unique<InputManager>();
// 窗口管理
@@ -95,4 +102,5 @@ void GameApplication::run() {
m_windowManager->endUI();
m_windowManager->Present();
}
}

View File

@@ -22,6 +22,7 @@ private:
std::unique_ptr<UIRenderer> m_uiRenderer;
std::unique_ptr<DebugManager> m_debugManager;
Config m_config;
public:
GameApplication();
@@ -29,5 +30,4 @@ public:
bool initialize();
SDL_AppResult handleInputEvent(SDL_Event* event);
void run();
};

View File

@@ -38,6 +38,9 @@ void SceneManager::registerAllScene() {
registerSceneFactory("GameScene", []() -> std::shared_ptr<Scene> {
return std::make_shared<GameScene>();
});
registerSceneFactory("OnlineGameScene", []() -> std::shared_ptr<Scene> {
return std::make_shared<OnlineGameScene>();
});
}
std::shared_ptr<Scene> SceneManager::createScene(const std::string& sceneName) {

View File

@@ -9,6 +9,7 @@
#include "Scene.h"
#include "scenes/gameplay/GameScene.h"
#include "scenes/menu/MainMenuScene.h"
#include "scenes/gameplay/OnlineGameScene.h"
#include <SDL3/SDL.h>
#include <string>
#include <stack>

View File

@@ -56,7 +56,7 @@ void GameScene::renderUI() {
}
void GameScene::handleClick(int logicalX, int logicalY) {
if (m_gameUIManager->handleClick(logicalX, logicalY)) {
if (m_gameUIManager && m_gameUIManager->handleClick(logicalX, logicalY)) {
return;
}

View File

@@ -21,12 +21,12 @@ public:
void restartGame();
private:
protected:
std::unique_ptr<BoardRenderer> m_boardRenderer;
std::unique_ptr<CoordinateConverter> m_CoordinateConverter;
std::unique_ptr<GameSession> m_gameSession;
private:
std::unique_ptr<GameUIManager> m_gameUIManager;

View File

@@ -0,0 +1,82 @@
#include "OnlineGameScene.h"
#include "core/GameApplication.h"
#include <iostream>
void OnlineGameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer) {
m_renderer = renderer;
m_uiRenderer = uiRenderer;
m_gameUIManager = std::make_unique<OnlineGameUIManager>(
[this](const std::string& sceneName) {
if (m_eventCallback) {
SceneEvent event{SceneEventType::ChangeScene, sceneName};
m_eventCallback(event);
}
}
);
m_networkManager = std::make_unique<NetworkManager>();
m_gameUIManager->init();
m_gameUIManager->setCallback([this]() {
this->restartGame();
});
m_gameUIManager->setOnlineTypeCallback(
[this](NetType type){
//std::cout << "try to init networkmanager\n";
if (!m_networkManager) {
std::cerr << "networkmanager is null\n";
}
m_networkManager->init(type);
if (type == NetType::CLIENT) {
m_isMyTurn = false;
m_myPlayerID = PlayerID::P2;
}
if (type == NetType::HOST) {
m_isMyTurn = true;
m_myPlayerID = PlayerID::P1;
}
}
);
m_boardRenderer = std::make_unique<BoardRenderer>(WIDTH, HEIGHT, renderer);
m_gameSession = std::make_unique<GameSession>();
m_CoordinateConverter = std::make_unique<CoordinateConverter>(renderer);
m_gameSession->initialize();
m_boardRenderer->setBoard(m_gameSession->getBoard());
}
void OnlineGameScene::renderWorld() {
GameScene::renderWorld();
}
void OnlineGameScene::renderUI() {
m_uiRenderer->renderUI(m_gameUIManager->getUIRenderData());
}
void OnlineGameScene::handleClick(int logicalX, int logicalY) {
if (m_gameUIManager && m_gameUIManager->handleClick(logicalX, logicalY)) {
return;
}
// 如果当前是自己的回合就处理点击
// 否则忽略
if (!m_isMyTurn) {\
std::cout << "it is not your turn\n";
return;
}
GameScene::handleClick(logicalX, logicalY);
if (m_gameSession->getCurrentPlayer() != m_myPlayerID) {
m_isMyTurn = false;
}
}
void OnlineGameScene::handleNetworkClick(int logicalX, int logicalY) {
if (m_isMyTurn) {
return;
}
GameScene::handleClick(logicalX, logicalY);
if (m_gameSession->getCurrentPlayer() == m_myPlayerID) {
m_isMyTurn = true;
}
}

View File

@@ -0,0 +1,22 @@
#pragma once
#include "GameScene.h"
#include "ui/managers/OnlineGameUIManager.h"
#include "network/NetworkManager.h"
class OnlineGameScene : public GameScene {
public:
void onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer) override;
void renderWorld() override;
void handleClick(int logicalX, int logicalY) override;
void handleNetworkClick(int logicalX, int logicalY);
void renderUI() override;
private:
PlayerID m_myPlayerID;
bool m_isMyTurn;
std::unique_ptr<NetworkManager> m_networkManager;
std::unique_ptr<OnlineGameUIManager> m_gameUIManager;
};

View File

@@ -23,7 +23,7 @@ public:
void updateGameState(GameState state);
bool handleClick(int logicalX, int logicalY);
private:
protected:
std::function<void()> m_restartCallback;
void setupUIComponents();

View File

@@ -18,6 +18,13 @@ void MainMenuUIManager::init() {
);
m_buttons.emplace(startButton->getNameHash(), std::move(startButton));
auto onlineStartButton = UIWidgetFactory::createStandardButton(
"OnlineStartButton", "联机对战", 275, 250,
[this]() {m_eventCallback("OnlineGameScene"); }
);
m_buttons.emplace(onlineStartButton->getNameHash(), std::move(onlineStartButton));
}

View File

@@ -0,0 +1,13 @@
#pragma once
#include "GameUIManager.h"
#include "network/NetData.h"
class OnlineGameUIManager : public GameUIManager {
public:
using OnlineTypeEvent = std::function<void(NetType )>;
OnlineGameUIManager(SceneEventCallback eventCallback);
~OnlineGameUIManager();
void init() override;
void setOnlineTypeCallback(OnlineTypeEvent type);
private:
OnlineTypeEvent m_onlineTypeEvent;
};