From 19698996cd29397389e7dd6ee60745f71da8ed58 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Sun, 28 Dec 2025 16:44:54 +0800 Subject: [PATCH] feat: read network config from JSON --- assets/config.json | 7 ++++++- src/network/NetworkManager.cpp | 9 +++++---- src/network/NetworkManager.h | 4 ++-- src/utils/Config.h | 7 +++++++ src/utils/ConfigLoader.cpp | 25 +++++++++++++++++++++++++ src/utils/ConfigLoader.h | 2 +- 6 files changed, 46 insertions(+), 8 deletions(-) diff --git a/assets/config.json b/assets/config.json index e364aed..e2c8343 100644 --- a/assets/config.json +++ b/assets/config.json @@ -16,5 +16,10 @@ "ui": { "font": "fonts/SourceHanSansSC-Regular.otf", "font_size": 16 + }, + "network": { + "server_ip": "127.0.0.1", + "port": 12345, + "max_players": 2 } -} \ No newline at end of file +} diff --git a/src/network/NetworkManager.cpp b/src/network/NetworkManager.cpp index 664d043..a725550 100644 --- a/src/network/NetworkManager.cpp +++ b/src/network/NetworkManager.cpp @@ -1,10 +1,11 @@ #include "NetworkManager.h" +#include "utils/ConfigLoader.h" #include NetworkManager::NetworkManager() : m_workguard(asio::make_work_guard(m_ioContext)) { std::cout << "NetworkManager constructor called\n"; - + m_config = ConfigLoader::load("assets/config.json"); } NetworkManager::~NetworkManager() { @@ -63,7 +64,7 @@ void NetworkManager::startServer() { if (!m_gameServer) { std::cerr << "gameServer is not esist\n"; } - m_gameServer->startServer(52025); + m_gameServer->startServer(m_config.network.port); std::cout << "start server success\n"; //m_ioContext.run(); @@ -92,10 +93,10 @@ void NetworkManager::startClient() { } ); if (m_netType == NetType::HOST) { - m_client->connect("127.0.0.1", 52025, true); + m_client->connect("127.0.0.1", m_config.network.port, true); } if (m_netType == NetType::CLIENT) { - m_client->connect("127.0.0.1", 52025, false); + m_client->connect(m_config.network.serverIP, m_config.network.port, false); //m_ioContext.run(); } std::cout << "start client success\n"; diff --git a/src/network/NetworkManager.h b/src/network/NetworkManager.h index 22d0827..02558e6 100644 --- a/src/network/NetworkManager.h +++ b/src/network/NetworkManager.h @@ -2,7 +2,7 @@ #include "network/client/Client.h" #include "network/server/GameServer.h" - +#include "utils/Config.h" class NetworkManager { public: using ClickEventCallback = std::function; @@ -40,7 +40,7 @@ private: ClickEventCallback m_clickEventCallback; StartGameCallback m_startGameCallback; - + Config m_config; bool m_isMyTurn = false; // 新增:当前是否是我的回合 void startServer(); diff --git a/src/utils/Config.h b/src/utils/Config.h index be4c800..35e2b6c 100644 --- a/src/utils/Config.h +++ b/src/utils/Config.h @@ -80,7 +80,14 @@ struct Viewport { SDL_FRect dst{}; }; +struct NetworkConfig { + int port = 12345; + int maxPlayers = 2; + std::string serverIP = "127.0.0.1"; +}; + struct Config { WindowConfig window; RenderConfig render; + NetworkConfig network; }; \ No newline at end of file diff --git a/src/utils/ConfigLoader.cpp b/src/utils/ConfigLoader.cpp index 4ef1c80..a6c4a0c 100644 --- a/src/utils/ConfigLoader.cpp +++ b/src/utils/ConfigLoader.cpp @@ -29,6 +29,20 @@ static void loadRender(const json& j, RenderConfig& render) { get("logical_height", render.logicalHeight); } +static void loadNetwork(const json& j, NetworkConfig& network) { + auto get = [&](const char* key, auto& out) { + if (j.contains(key)) + j.at(key).get_to(out); + else { + std::cout << "Unkonw key " << key << "\n"; + } + }; + get("port", network.port); + get("max_players", network.maxPlayers); + get("server_ip", network.serverIP); +} + + bool ConfigLoader::load(const std::string& path, Config& config) { std::ifstream file(path); @@ -53,7 +67,18 @@ bool ConfigLoader::load(const std::string& path, Config& config) { if (j.contains("render")) { loadRender(j["render"], config.render); } + if (j.contains("network")) { + loadNetwork(j["network"], config.network); + } std::cout << "load json success!\n"; return true; +} + +Config ConfigLoader::load(const std::string& path) { + Config config; + if (!load(path, config)) { + std::cerr << "[ConfigLoader] Failed to load config from " << path << "\n"; + } + return config; } \ No newline at end of file diff --git a/src/utils/ConfigLoader.h b/src/utils/ConfigLoader.h index ba24106..1565f4c 100644 --- a/src/utils/ConfigLoader.h +++ b/src/utils/ConfigLoader.h @@ -6,6 +6,6 @@ class ConfigLoader { public: static bool load(const std::string& path, Config& config); - + static Config load(const std::string&path); };