diff --git a/src/core/GameApplication.cpp b/src/core/GameApplication.cpp index 7b6b2ad..4f17f16 100644 --- a/src/core/GameApplication.cpp +++ b/src/core/GameApplication.cpp @@ -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(); // 窗口管理 @@ -95,4 +102,5 @@ void GameApplication::run() { m_windowManager->endUI(); m_windowManager->Present(); -} \ No newline at end of file +} + diff --git a/src/core/GameApplication.h b/src/core/GameApplication.h index e96cb3c..cfcad0c 100644 --- a/src/core/GameApplication.h +++ b/src/core/GameApplication.h @@ -22,6 +22,7 @@ private: std::unique_ptr m_uiRenderer; std::unique_ptr m_debugManager; Config m_config; + public: GameApplication(); @@ -29,5 +30,4 @@ public: bool initialize(); SDL_AppResult handleInputEvent(SDL_Event* event); void run(); - }; \ No newline at end of file diff --git a/src/scenes/base/SceneManager.cpp b/src/scenes/base/SceneManager.cpp index 0b911a9..193be9e 100644 --- a/src/scenes/base/SceneManager.cpp +++ b/src/scenes/base/SceneManager.cpp @@ -38,6 +38,9 @@ void SceneManager::registerAllScene() { registerSceneFactory("GameScene", []() -> std::shared_ptr { return std::make_shared(); }); + registerSceneFactory("OnlineGameScene", []() -> std::shared_ptr { + return std::make_shared(); + }); } std::shared_ptr SceneManager::createScene(const std::string& sceneName) { diff --git a/src/scenes/base/SceneManager.h b/src/scenes/base/SceneManager.h index 6e38d14..833baf0 100644 --- a/src/scenes/base/SceneManager.h +++ b/src/scenes/base/SceneManager.h @@ -9,6 +9,7 @@ #include "Scene.h" #include "scenes/gameplay/GameScene.h" #include "scenes/menu/MainMenuScene.h" +#include "scenes/gameplay/OnlineGameScene.h" #include #include #include diff --git a/src/scenes/gameplay/GameScene.cpp b/src/scenes/gameplay/GameScene.cpp index f41702e..e97271a 100644 --- a/src/scenes/gameplay/GameScene.cpp +++ b/src/scenes/gameplay/GameScene.cpp @@ -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; } diff --git a/src/scenes/gameplay/GameScene.h b/src/scenes/gameplay/GameScene.h index b53d512..5cb9b9f 100644 --- a/src/scenes/gameplay/GameScene.h +++ b/src/scenes/gameplay/GameScene.h @@ -21,12 +21,12 @@ public: void restartGame(); -private: +protected: std::unique_ptr m_boardRenderer; std::unique_ptr m_CoordinateConverter; std::unique_ptr m_gameSession; - +private: std::unique_ptr m_gameUIManager; diff --git a/src/scenes/gameplay/OnlineGameScene.cpp b/src/scenes/gameplay/OnlineGameScene.cpp new file mode 100644 index 0000000..42f5461 --- /dev/null +++ b/src/scenes/gameplay/OnlineGameScene.cpp @@ -0,0 +1,82 @@ +#include "OnlineGameScene.h" +#include "core/GameApplication.h" +#include +void OnlineGameScene::onEnter(SDL_Renderer* renderer, int WIDTH, int HEIGHT, UIRenderer* uiRenderer) { + m_renderer = renderer; + m_uiRenderer = uiRenderer; + m_gameUIManager = std::make_unique( + [this](const std::string& sceneName) { + if (m_eventCallback) { + SceneEvent event{SceneEventType::ChangeScene, sceneName}; + m_eventCallback(event); + } + } + ); + m_networkManager = std::make_unique(); + + 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(WIDTH, HEIGHT, renderer); + m_gameSession = std::make_unique(); + m_CoordinateConverter = std::make_unique(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; + } +} \ No newline at end of file diff --git a/src/scenes/gameplay/OnlineGameScene.h b/src/scenes/gameplay/OnlineGameScene.h new file mode 100644 index 0000000..d900e43 --- /dev/null +++ b/src/scenes/gameplay/OnlineGameScene.h @@ -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 m_networkManager; + std::unique_ptr m_gameUIManager; +}; \ No newline at end of file diff --git a/src/ui/managers/GameUIManager.h b/src/ui/managers/GameUIManager.h index 5f17f43..1d84981 100644 --- a/src/ui/managers/GameUIManager.h +++ b/src/ui/managers/GameUIManager.h @@ -23,7 +23,7 @@ public: void updateGameState(GameState state); bool handleClick(int logicalX, int logicalY); -private: +protected: std::function m_restartCallback; void setupUIComponents(); diff --git a/src/ui/managers/MainMenuUIManager.cpp b/src/ui/managers/MainMenuUIManager.cpp index 4715c82..f314b9e 100644 --- a/src/ui/managers/MainMenuUIManager.cpp +++ b/src/ui/managers/MainMenuUIManager.cpp @@ -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)); } diff --git a/src/ui/managers/OnlineGameUIManager.h b/src/ui/managers/OnlineGameUIManager.h new file mode 100644 index 0000000..0094f19 --- /dev/null +++ b/src/ui/managers/OnlineGameUIManager.h @@ -0,0 +1,13 @@ +#pragma once +#include "GameUIManager.h" +#include "network/NetData.h" +class OnlineGameUIManager : public GameUIManager { +public: + using OnlineTypeEvent = std::function; + OnlineGameUIManager(SceneEventCallback eventCallback); + ~OnlineGameUIManager(); + void init() override; + void setOnlineTypeCallback(OnlineTypeEvent type); +private: + OnlineTypeEvent m_onlineTypeEvent; +}; \ No newline at end of file