mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-08-09 02:07:04 +08:00
refactor: move server logic to WorldScene and refactor UI methods
This commit is contained in:
@@ -1,7 +1,5 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "Cubed/audio/audio_engine.hpp"
|
#include "Cubed/audio/audio_engine.hpp"
|
||||||
#include "Cubed/gameplay/network_server.hpp"
|
|
||||||
#include "Cubed/gameplay/server_world.hpp"
|
|
||||||
#define GLFW_INCLUDE_NONE
|
#define GLFW_INCLUDE_NONE
|
||||||
#include "Cubed/argument.hpp"
|
#include "Cubed/argument.hpp"
|
||||||
#include "Cubed/config.hpp"
|
#include "Cubed/config.hpp"
|
||||||
@@ -40,7 +38,7 @@ public:
|
|||||||
Renderer& renderer();
|
Renderer& renderer();
|
||||||
TextureManager& texture_manager();
|
TextureManager& texture_manager();
|
||||||
Window& window();
|
Window& window();
|
||||||
ServerWorld& server_world();
|
|
||||||
Config& config();
|
Config& config();
|
||||||
const Argument& argument() const;
|
const Argument& argument() const;
|
||||||
AudioEngine& audio();
|
AudioEngine& audio();
|
||||||
@@ -49,7 +47,7 @@ private:
|
|||||||
Config m_game_config;
|
Config m_game_config;
|
||||||
|
|
||||||
TextureManager m_texture_manager;
|
TextureManager m_texture_manager;
|
||||||
NetworkServer m_server;
|
|
||||||
AudioEngine m_audio;
|
AudioEngine m_audio;
|
||||||
|
|
||||||
Renderer m_renderer;
|
Renderer m_renderer;
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "Cubed/camera.hpp"
|
#include "Cubed/camera.hpp"
|
||||||
#include "Cubed/dev_panel.hpp"
|
#include "Cubed/dev_panel.hpp"
|
||||||
#include "Cubed/gameplay/client_world.hpp"
|
#include "Cubed/gameplay/client_world.hpp"
|
||||||
|
#include "Cubed/gameplay/network_server.hpp"
|
||||||
#include "Cubed/scene/scene.hpp"
|
#include "Cubed/scene/scene.hpp"
|
||||||
#include "Cubed/ui/world_ui_manager.hpp"
|
#include "Cubed/ui/world_ui_manager.hpp"
|
||||||
namespace Cubed {
|
namespace Cubed {
|
||||||
@@ -26,11 +27,13 @@ public:
|
|||||||
Camera& camera();
|
Camera& camera();
|
||||||
SceneManager& scene_manager();
|
SceneManager& scene_manager();
|
||||||
ClientWorld& client_world();
|
ClientWorld& client_world();
|
||||||
|
ServerWorld& server_world();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
SceneManager& m_scene_manager;
|
SceneManager& m_scene_manager;
|
||||||
DevPanel m_dev_panel;
|
DevPanel m_dev_panel;
|
||||||
Camera m_camera;
|
Camera m_camera;
|
||||||
|
NetworkServer m_server;
|
||||||
std::shared_ptr<NetworkClient> m_client;
|
std::shared_ptr<NetworkClient> m_client;
|
||||||
ClientWorld m_client_world;
|
ClientWorld m_client_world;
|
||||||
WorldUIManager m_ui_manager;
|
WorldUIManager m_ui_manager;
|
||||||
|
|||||||
@@ -16,9 +16,6 @@ public:
|
|||||||
Button& operator=(const Button&) = delete;
|
Button& operator=(const Button&) = delete;
|
||||||
Button& operator=(Button&&) = delete;
|
Button& operator=(Button&&) = delete;
|
||||||
|
|
||||||
void render(Renderer& renderer) override;
|
|
||||||
void update(float dt) override;
|
|
||||||
|
|
||||||
bool handle_mouse_move_event(const MouseMoveEvent& e) override;
|
bool handle_mouse_move_event(const MouseMoveEvent& e) override;
|
||||||
bool handle_mouse_button_event(const MouseButtonEvent& e) override;
|
bool handle_mouse_button_event(const MouseButtonEvent& e) override;
|
||||||
void set_window_size(int width, int height) override;
|
void set_window_size(int width, int height) override;
|
||||||
@@ -54,5 +51,8 @@ private:
|
|||||||
std::unique_ptr<Image> m_background;
|
std::unique_ptr<Image> m_background;
|
||||||
std::unique_ptr<Label> m_foreground;
|
std::unique_ptr<Label> m_foreground;
|
||||||
bool m_hovered = false;
|
bool m_hovered = false;
|
||||||
|
|
||||||
|
void on_render(Renderer& renderer) override;
|
||||||
|
void on_update(float dt) override;
|
||||||
};
|
};
|
||||||
} // namespace Cubed
|
} // namespace Cubed
|
||||||
@@ -9,8 +9,6 @@ class TextureManager;
|
|||||||
class Image : public Widget {
|
class Image : public Widget {
|
||||||
public:
|
public:
|
||||||
Image(Widget* parent);
|
Image(Widget* parent);
|
||||||
void update(float dt) override;
|
|
||||||
void render(Renderer& renderer) override;
|
|
||||||
|
|
||||||
Image& set_image(const std::string& path, TextureManager& texture_manager);
|
Image& set_image(const std::string& path, TextureManager& texture_manager);
|
||||||
float width() const override;
|
float width() const override;
|
||||||
@@ -20,6 +18,8 @@ public:
|
|||||||
float scale() const;
|
float scale() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void on_render(Renderer& renderer) override;
|
||||||
|
|
||||||
const Texture* m_texture = nullptr;
|
const Texture* m_texture = nullptr;
|
||||||
glm::vec2 m_pos{0.0f, 0.0f};
|
glm::vec2 m_pos{0.0f, 0.0f};
|
||||||
float m_scale = 1.0f;
|
float m_scale = 1.0f;
|
||||||
|
|||||||
@@ -18,8 +18,6 @@ public:
|
|||||||
|
|
||||||
Label& set_color(Color color);
|
Label& set_color(Color color);
|
||||||
Label& set_scale(float scale);
|
Label& set_scale(float scale);
|
||||||
virtual void update(float dt) override;
|
|
||||||
virtual void render(Renderer& renderer) override;
|
|
||||||
|
|
||||||
const UIVertexData& data() const;
|
const UIVertexData& data() const;
|
||||||
|
|
||||||
|
|||||||
@@ -12,9 +12,6 @@ public:
|
|||||||
Rect(Widget* parent);
|
Rect(Widget* parent);
|
||||||
~Rect();
|
~Rect();
|
||||||
|
|
||||||
void update(float dt) override;
|
|
||||||
void render(Renderer& renderer) override;
|
|
||||||
|
|
||||||
float width() const override;
|
float width() const override;
|
||||||
float height() const override;
|
float height() const override;
|
||||||
float alpha() const;
|
float alpha() const;
|
||||||
@@ -31,6 +28,9 @@ public:
|
|||||||
Color color() const;
|
Color color() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void on_update(float dt) override;
|
||||||
|
void on_render(Renderer& renderer) override;
|
||||||
|
|
||||||
Color m_color = Color::WHITE;
|
Color m_color = Color::WHITE;
|
||||||
float m_width = 0.0f;
|
float m_width = 0.0f;
|
||||||
float m_height = 0.0f;
|
float m_height = 0.0f;
|
||||||
|
|||||||
15
src/app.cpp
15
src/app.cpp
@@ -65,17 +65,12 @@ void App::init(int argc, char** argv) {
|
|||||||
glfwSetCharCallback(m_window.get_glfw_window(), char_callback);
|
glfwSetCharCallback(m_window.get_glfw_window(), char_callback);
|
||||||
|
|
||||||
m_audio.init();
|
m_audio.init();
|
||||||
|
|
||||||
ChunkGenerator::init();
|
|
||||||
BlockManager::init();
|
BlockManager::init();
|
||||||
m_renderer.init(m_argument.debug_on);
|
m_renderer.init(m_argument.debug_on);
|
||||||
Logger::info("Renderer Init Success");
|
Logger::info("Renderer Init Success");
|
||||||
// MapTable::init_map();
|
// MapTable::init_map();
|
||||||
m_texture_manager.init_texture();
|
m_texture_manager.init_texture();
|
||||||
Logger::info("Texture Load Success");
|
Logger::info("Texture Load Success");
|
||||||
if (!m_argument.is_client) {
|
|
||||||
m_server.start_server(m_argument.port);
|
|
||||||
}
|
|
||||||
|
|
||||||
m_scene_manager.request_push(SceneType::MAIN_MENU);
|
m_scene_manager.request_push(SceneType::MAIN_MENU);
|
||||||
|
|
||||||
@@ -669,10 +664,6 @@ void App::run() {
|
|||||||
update();
|
update();
|
||||||
render();
|
render();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!m_argument.is_client) {
|
|
||||||
m_server.server_world().stop();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// static Gait player_gait = Gait::WALK;
|
// static Gait player_gait = Gait::WALK;
|
||||||
void App::update() {
|
void App::update() {
|
||||||
@@ -733,6 +724,10 @@ void App::dispatch_event(const Event& e) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (DebugCollector::get().handle_event(e)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_scene_manager.handle_event(e)) {
|
if (m_scene_manager.handle_event(e)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -764,7 +759,7 @@ float App::get_fps() { return fps; }
|
|||||||
Renderer& App::renderer() { return m_renderer; }
|
Renderer& App::renderer() { return m_renderer; }
|
||||||
TextureManager& App::texture_manager() { return m_texture_manager; }
|
TextureManager& App::texture_manager() { return m_texture_manager; }
|
||||||
Window& App::window() { return m_window; }
|
Window& App::window() { return m_window; }
|
||||||
ServerWorld& App::server_world() { return m_server.server_world(); }
|
|
||||||
Config& App::config() { return m_game_config; }
|
Config& App::config() { return m_game_config; }
|
||||||
const Argument& App::argument() const { return m_argument; }
|
const Argument& App::argument() const { return m_argument; }
|
||||||
AudioEngine& App::audio() { return m_audio; }
|
AudioEngine& App::audio() { return m_audio; }
|
||||||
|
|||||||
@@ -270,7 +270,7 @@ void DevPanel::show_biome_table_bar() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DevPanel::show_time_table_bar() {
|
void DevPanel::show_time_table_bar() {
|
||||||
ServerWorld& world = m_app.server_world();
|
ServerWorld& world = m_world_scene.server_world();
|
||||||
ImGui::Text("Game Tick %llu", world.game_tick());
|
ImGui::Text("Game Tick %llu", world.game_tick());
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
ImGui::Text("Day Tick %llu", world.day_tick());
|
ImGui::Text("Day Tick %llu", world.day_tick());
|
||||||
@@ -495,40 +495,42 @@ void DevPanel::show_server_world_table_bar() {
|
|||||||
ImGui::Text("ChunkGenerator Seed: %u", ChunkGenerator::seed());
|
ImGui::Text("ChunkGenerator Seed: %u", ChunkGenerator::seed());
|
||||||
|
|
||||||
ImGui::Text("Pool Threads %d Max Support Threads %d Reserved Threads %d",
|
ImGui::Text("Pool Threads %d Max Support Threads %d Reserved Threads %d",
|
||||||
m_app.server_world().gen_pool_threads(),
|
m_world_scene.server_world().gen_pool_threads(),
|
||||||
m_app.server_world().max_threads(), RESERVED_THREADS);
|
m_world_scene.server_world().max_threads(), RESERVED_THREADS);
|
||||||
ImGui::SliderInt("Set Pool Threads", &m_threads, 1,
|
ImGui::SliderInt("Set Pool Threads", &m_threads, 1,
|
||||||
m_app.server_world().max_threads());
|
m_world_scene.server_world().max_threads());
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Button("Set")) {
|
if (ImGui::Button("Set")) {
|
||||||
m_app.server_world().change_pool_threads(
|
m_world_scene.server_world().change_pool_threads(
|
||||||
ServerWorld::ThreadPoolKind::GEN, m_threads);
|
ServerWorld::ThreadPoolKind::GEN, m_threads);
|
||||||
}
|
}
|
||||||
if (m_threads > m_app.server_world().max_threads() - RESERVED_THREADS) {
|
if (m_threads >
|
||||||
|
m_world_scene.server_world().max_threads() - RESERVED_THREADS) {
|
||||||
ImGui::TextColored(
|
ImGui::TextColored(
|
||||||
ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
|
ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
|
||||||
"Waring: When the threads in the thread pool exceed \n(maximum "
|
"Waring: When the threads in the thread pool exceed \n(maximum "
|
||||||
"threads minus reserved threads), \nit may cause stuttering.");
|
"threads minus reserved threads), \nit may cause stuttering.");
|
||||||
}
|
}
|
||||||
|
|
||||||
m_chunk_style = m_app.server_world().chunk_load_style();
|
m_chunk_style = m_world_scene.server_world().chunk_load_style();
|
||||||
if (ImGui::Combo("ChunkLoadStyle", &m_chunk_style, CHUNK_LOAD_STYLE,
|
if (ImGui::Combo("ChunkLoadStyle", &m_chunk_style, CHUNK_LOAD_STYLE,
|
||||||
IM_ARRAYSIZE(CHUNK_LOAD_STYLE))) {
|
IM_ARRAYSIZE(CHUNK_LOAD_STYLE))) {
|
||||||
m_app.server_world().set_chunk_load_style(m_chunk_style);
|
m_world_scene.server_world().set_chunk_load_style(m_chunk_style);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ImGui::Button("Request Chunk Build")) {
|
if (ImGui::Button("Request Chunk Build")) {
|
||||||
m_app.server_world().need_gen(m_player->get_uuid());
|
m_world_scene.server_world().need_gen(m_player->get_uuid());
|
||||||
}
|
}
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::Checkbox("Gen Thread", &m_gen_thread_running)) {
|
if (ImGui::Checkbox("Gen Thread", &m_gen_thread_running)) {
|
||||||
if (m_gen_thread_running) {
|
if (m_gen_thread_running) {
|
||||||
m_app.server_world().start_gen_thread();
|
m_world_scene.server_world().start_gen_thread();
|
||||||
} else {
|
} else {
|
||||||
m_app.server_world().stop_gen_thread();
|
m_world_scene.server_world().stop_gen_thread();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::Text("Server Chunk Size %d", m_app.server_world().chunk_size());
|
ImGui::Text("Server Chunk Size %d",
|
||||||
|
m_world_scene.server_world().chunk_size());
|
||||||
|
|
||||||
if (ImGui::BeginTabBar("World Settings")) {
|
if (ImGui::BeginTabBar("World Settings")) {
|
||||||
if (ImGui::BeginTabItem("Time")) {
|
if (ImGui::BeginTabItem("Time")) {
|
||||||
|
|||||||
@@ -61,6 +61,11 @@ bool WorldScene::handle_event(const Event& e) {
|
|||||||
}
|
}
|
||||||
void WorldScene::on_enter() {
|
void WorldScene::on_enter() {
|
||||||
|
|
||||||
|
ChunkGenerator::init();
|
||||||
|
|
||||||
|
if (!m_argument.is_client) {
|
||||||
|
m_server.start_server(m_argument.port);
|
||||||
|
}
|
||||||
m_client = std::make_shared<NetworkClient>(m_client_world);
|
m_client = std::make_shared<NetworkClient>(m_client_world);
|
||||||
|
|
||||||
m_client->start(m_argument.ip, m_argument.port);
|
m_client->start(m_argument.ip, m_argument.port);
|
||||||
@@ -80,9 +85,14 @@ void WorldScene::on_leave() {
|
|||||||
|
|
||||||
m_scene_manager.app().window().set_camera(nullptr);
|
m_scene_manager.app().window().set_camera(nullptr);
|
||||||
m_scene_manager.app().window().set_game_running(false);
|
m_scene_manager.app().window().set_game_running(false);
|
||||||
|
|
||||||
|
if (!m_argument.is_client) {
|
||||||
|
m_server.server_world().stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Camera& WorldScene::camera() { return m_camera; }
|
Camera& WorldScene::camera() { return m_camera; }
|
||||||
SceneManager& WorldScene::scene_manager() { return m_scene_manager; }
|
SceneManager& WorldScene::scene_manager() { return m_scene_manager; }
|
||||||
ClientWorld& WorldScene::client_world() { return m_client_world; }
|
ClientWorld& WorldScene::client_world() { return m_client_world; }
|
||||||
|
ServerWorld& WorldScene::server_world() { return m_server.server_world(); }
|
||||||
} // namespace Cubed
|
} // namespace Cubed
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
namespace Cubed {
|
namespace Cubed {
|
||||||
Button::Button(Widget* parent) : Widget(parent) {}
|
Button::Button(Widget* parent) : Widget(parent) {}
|
||||||
|
|
||||||
void Button::update(float dt) {
|
void Button::on_update(float dt) {
|
||||||
if (m_background) {
|
if (m_background) {
|
||||||
m_background->update(dt);
|
m_background->update(dt);
|
||||||
}
|
}
|
||||||
@@ -12,7 +12,7 @@ void Button::update(float dt) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Button::render(Renderer& renderer) {
|
void Button::on_render(Renderer& renderer) {
|
||||||
if (m_background) {
|
if (m_background) {
|
||||||
m_background->render(renderer);
|
m_background->render(renderer);
|
||||||
}
|
}
|
||||||
@@ -32,6 +32,10 @@ bool Button::handle_mouse_move_event(const MouseMoveEvent& e) {
|
|||||||
}
|
}
|
||||||
m_hovered = false;
|
m_hovered = false;
|
||||||
|
|
||||||
|
if (Widget::handle_mouse_move_event(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
bool Button::handle_mouse_button_event(const MouseButtonEvent& e) {
|
bool Button::handle_mouse_button_event(const MouseButtonEvent& e) {
|
||||||
@@ -42,6 +46,11 @@ bool Button::handle_mouse_button_event(const MouseButtonEvent& e) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Widget::handle_mouse_button_event(e)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,6 +60,7 @@ Button& Button::set_scale(float scale) {
|
|||||||
}
|
}
|
||||||
void Button::set_window_size(int width, int height) {
|
void Button::set_window_size(int width, int height) {
|
||||||
m_background->set_window_size(width, height);
|
m_background->set_window_size(width, height);
|
||||||
|
Widget::set_window_size(width, height);
|
||||||
}
|
}
|
||||||
Widget& Button::set_anchor(Anchor anchor) {
|
Widget& Button::set_anchor(Anchor anchor) {
|
||||||
m_background->set_anchor(anchor);
|
m_background->set_anchor(anchor);
|
||||||
|
|||||||
@@ -5,8 +5,8 @@
|
|||||||
|
|
||||||
namespace Cubed {
|
namespace Cubed {
|
||||||
Image::Image(Widget* parent) : Widget(parent) {}
|
Image::Image(Widget* parent) : Widget(parent) {}
|
||||||
void Image::update(float) {}
|
|
||||||
void Image::render(Renderer& renderer) { renderer.render_image(*this); }
|
void Image::on_render(Renderer& renderer) { renderer.render_image(*this); }
|
||||||
|
|
||||||
Image& Image::set_image(const std::string& path,
|
Image& Image::set_image(const std::string& path,
|
||||||
TextureManager& texture_manager) {
|
TextureManager& texture_manager) {
|
||||||
|
|||||||
@@ -19,12 +19,9 @@ Label& Label::set_scale(float scale) {
|
|||||||
m_scale = scale;
|
m_scale = scale;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
void Label::update(float dt) { on_update(dt); }
|
|
||||||
|
|
||||||
void Label::on_update(float dt) { (void)dt; }
|
void Label::on_update(float dt) { (void)dt; }
|
||||||
|
|
||||||
void Label::render(Renderer& renderer) { on_render(renderer); }
|
|
||||||
|
|
||||||
void Label::on_render(Renderer& renderer) { renderer.render_lable(*this); }
|
void Label::on_render(Renderer& renderer) { renderer.render_lable(*this); }
|
||||||
|
|
||||||
void Label::update_vertices() {
|
void Label::update_vertices() {
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ Rect::Rect(Widget* parent)
|
|||||||
};
|
};
|
||||||
|
|
||||||
Rect::~Rect() {}
|
Rect::~Rect() {}
|
||||||
void Rect::update(float dt) {
|
|
||||||
|
void Rect::on_update(float) {
|
||||||
if (m_fill) {
|
if (m_fill) {
|
||||||
if (!m_parent) {
|
if (!m_parent) {
|
||||||
m_width = m_window_width;
|
m_width = m_window_width;
|
||||||
@@ -18,12 +19,8 @@ void Rect::update(float dt) {
|
|||||||
m_height = m_parent->height();
|
m_height = m_parent->height();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Widget::update(dt);
|
|
||||||
}
|
|
||||||
void Rect::render(Renderer& renderer) {
|
|
||||||
renderer.render_rect(*this);
|
|
||||||
Widget::render(renderer);
|
|
||||||
}
|
}
|
||||||
|
void Rect::on_render(Renderer& renderer) { renderer.render_rect(*this); }
|
||||||
|
|
||||||
float Rect::width() const { return m_width * m_scale; }
|
float Rect::width() const { return m_width * m_scale; }
|
||||||
float Rect::height() const { return m_height * m_scale; }
|
float Rect::height() const { return m_height * m_scale; }
|
||||||
|
|||||||
Reference in New Issue
Block a user