refactor: move server logic to WorldScene and refactor UI methods

This commit is contained in:
2026-07-14 09:44:52 +08:00
parent 558fd6311d
commit d1db165ca3
13 changed files with 59 additions and 49 deletions

View File

@@ -65,17 +65,12 @@ void App::init(int argc, char** argv) {
glfwSetCharCallback(m_window.get_glfw_window(), char_callback);
m_audio.init();
ChunkGenerator::init();
BlockManager::init();
m_renderer.init(m_argument.debug_on);
Logger::info("Renderer Init Success");
// MapTable::init_map();
m_texture_manager.init_texture();
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);
@@ -669,10 +664,6 @@ void App::run() {
update();
render();
}
if (!m_argument.is_client) {
m_server.server_world().stop();
}
}
// static Gait player_gait = Gait::WALK;
void App::update() {
@@ -733,6 +724,10 @@ void App::dispatch_event(const Event& e) {
return;
}
if (DebugCollector::get().handle_event(e)) {
return;
}
if (m_scene_manager.handle_event(e)) {
return;
}
@@ -764,7 +759,7 @@ float App::get_fps() { return fps; }
Renderer& App::renderer() { return m_renderer; }
TextureManager& App::texture_manager() { return m_texture_manager; }
Window& App::window() { return m_window; }
ServerWorld& App::server_world() { return m_server.server_world(); }
Config& App::config() { return m_game_config; }
const Argument& App::argument() const { return m_argument; }
AudioEngine& App::audio() { return m_audio; }

View File

@@ -270,7 +270,7 @@ void DevPanel::show_biome_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::SameLine();
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("Pool Threads %d Max Support Threads %d Reserved Threads %d",
m_app.server_world().gen_pool_threads(),
m_app.server_world().max_threads(), RESERVED_THREADS);
m_world_scene.server_world().gen_pool_threads(),
m_world_scene.server_world().max_threads(), RESERVED_THREADS);
ImGui::SliderInt("Set Pool Threads", &m_threads, 1,
m_app.server_world().max_threads());
m_world_scene.server_world().max_threads());
ImGui::SameLine();
if (ImGui::Button("Set")) {
m_app.server_world().change_pool_threads(
m_world_scene.server_world().change_pool_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(
ImVec4(1.0f, 1.0f, 0.0f, 1.0f),
"Waring: When the threads in the thread pool exceed \n(maximum "
"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,
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")) {
m_app.server_world().need_gen(m_player->get_uuid());
m_world_scene.server_world().need_gen(m_player->get_uuid());
}
ImGui::SameLine();
if (ImGui::Checkbox("Gen Thread", &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 {
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::BeginTabItem("Time")) {

View File

@@ -61,6 +61,11 @@ bool WorldScene::handle_event(const Event& e) {
}
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->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_game_running(false);
if (!m_argument.is_client) {
m_server.server_world().stop();
}
}
Camera& WorldScene::camera() { return m_camera; }
SceneManager& WorldScene::scene_manager() { return m_scene_manager; }
ClientWorld& WorldScene::client_world() { return m_client_world; }
ServerWorld& WorldScene::server_world() { return m_server.server_world(); }
} // namespace Cubed

View File

@@ -3,7 +3,7 @@
namespace Cubed {
Button::Button(Widget* parent) : Widget(parent) {}
void Button::update(float dt) {
void Button::on_update(float dt) {
if (m_background) {
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) {
m_background->render(renderer);
}
@@ -32,6 +32,10 @@ bool Button::handle_mouse_move_event(const MouseMoveEvent& e) {
}
m_hovered = false;
if (Widget::handle_mouse_move_event(e)) {
return true;
}
return false;
}
bool Button::handle_mouse_button_event(const MouseButtonEvent& e) {
@@ -42,6 +46,11 @@ bool Button::handle_mouse_button_event(const MouseButtonEvent& e) {
return true;
}
}
if (Widget::handle_mouse_button_event(e)) {
return true;
}
return false;
}
@@ -51,6 +60,7 @@ Button& Button::set_scale(float scale) {
}
void Button::set_window_size(int width, int height) {
m_background->set_window_size(width, height);
Widget::set_window_size(width, height);
}
Widget& Button::set_anchor(Anchor anchor) {
m_background->set_anchor(anchor);

View File

@@ -5,8 +5,8 @@
namespace Cubed {
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,
TextureManager& texture_manager) {

View File

@@ -19,12 +19,9 @@ Label& Label::set_scale(float scale) {
m_scale = scale;
return *this;
}
void Label::update(float dt) { on_update(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::update_vertices() {

View File

@@ -8,7 +8,8 @@ Rect::Rect(Widget* parent)
};
Rect::~Rect() {}
void Rect::update(float dt) {
void Rect::on_update(float) {
if (m_fill) {
if (!m_parent) {
m_width = m_window_width;
@@ -18,12 +19,8 @@ void Rect::update(float dt) {
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::height() const { return m_height * m_scale; }