From 98967275ffe6d90cf2ec85730b252d9dd7d7f2b6 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Fri, 13 Mar 2026 16:35:36 +0800 Subject: [PATCH] feat: move players to world instead of main --- include/Cubed/gameplay/player.hpp | 12 ++++++++---- include/Cubed/gameplay/world.hpp | 7 ++++--- include/Cubed/tools/cubed_assert.hpp | 2 +- src/gameplay/player.cpp | 9 ++++----- src/gameplay/world.cpp | 21 ++++++++++++++++++++- src/main.cpp | 7 +++---- 6 files changed, 40 insertions(+), 18 deletions(-) diff --git a/include/Cubed/gameplay/player.hpp b/include/Cubed/gameplay/player.hpp index e911e34..3818de1 100644 --- a/include/Cubed/gameplay/player.hpp +++ b/include/Cubed/gameplay/player.hpp @@ -2,6 +2,8 @@ #include #include + +#include struct MoveState { bool forward = false; bool back = false; @@ -11,12 +13,11 @@ struct MoveState { bool up = false; }; +class World; class Player { private: - bool** m_block_present; - float m_yaw; float m_pitch; @@ -29,14 +30,17 @@ private: glm::vec3 m_right; MoveState m_move_state; + std::string m_name; + const World& m_world; + + public: - Player(); + Player(const World& world, const std::string& name); const glm::vec3& get_front() const; const glm::vec3& get_player_pos() const; const MoveState& get_move_state() const; - void init(bool** block_present); void set_player_pos(const glm::vec3& pos); void update(float delta_time); void update_front_vec(float offset_x, float offset_y); diff --git a/include/Cubed/gameplay/world.hpp b/include/Cubed/gameplay/world.hpp index 75f1abb..30a5ef5 100644 --- a/include/Cubed/gameplay/world.hpp +++ b/include/Cubed/gameplay/world.hpp @@ -3,22 +3,23 @@ #include - +class Player; class World { private: BlockRenderData m_block_render_data; std::unordered_map m_chunks; - + std::unordered_map m_players; public: World(); ~World(); const BlockRenderData& get_block_render_data(int x, int y ,int z); + Player& get_player(const std::string& name); void init_world(); void render(); - + void update(float delta_time); }; \ No newline at end of file diff --git a/include/Cubed/tools/cubed_assert.hpp b/include/Cubed/tools/cubed_assert.hpp index 2b5ec4b..d76acca 100644 --- a/include/Cubed/tools/cubed_assert.hpp +++ b/include/Cubed/tools/cubed_assert.hpp @@ -3,7 +3,7 @@ namespace Assert { inline void msg(const char* condition, const char* file, int line, const char* func, - const std::string& message + const std::string& message = "" ) { LOG::error("Assertion failed: {} at {}: {} in function {}", diff --git a/src/gameplay/player.cpp b/src/gameplay/player.cpp index 47f2b4f..144566c 100644 --- a/src/gameplay/player.cpp +++ b/src/gameplay/player.cpp @@ -2,7 +2,10 @@ #include -Player::Player() { +Player::Player(const World& world, const std::string& name) : + m_world(world), + m_name(name) +{ } @@ -18,10 +21,6 @@ const MoveState& Player::get_move_state() const { return m_move_state; } -void Player::init(bool** block_present) { - m_block_present = block_present; -} - void Player::set_player_pos(const glm::vec3& pos) { m_player_pos = pos; } diff --git a/src/gameplay/world.cpp b/src/gameplay/world.cpp index a29b24c..529b759 100644 --- a/src/gameplay/world.cpp +++ b/src/gameplay/world.cpp @@ -1,5 +1,7 @@ +#include #include #include +#include World::World() { } @@ -209,6 +211,16 @@ const BlockRenderData& World::get_block_render_data(int world_x, int world_y ,in return m_block_render_data; } +Player& World::get_player(const std::string& name){ + auto it = m_players.find(HASH::str(name)); + if (it == m_players.end()) { + LOG::error("Can't find player {}", name); + CUBED_ASSERT(0); + } + + return it->second; +} + void World::init_world() { for (int s = 0; s < DISTANCE; s++) { @@ -235,7 +247,8 @@ void World::init_world() { chunk.gen_vertex_data(); } - + // init players + m_players.emplace(HASH::str("TestPlayer"), Player(*this, "TestPlayer")); } void World::render() { @@ -255,4 +268,10 @@ void World::render() { glBindBuffer(GL_ARRAY_BUFFER, 0); //LOG::info("Chunk {} {} render finished", pos.x, pos.z); } +} + +void World::update(float delta_time) { + for (auto& player : m_players) { + player.second.update(delta_time); + } } \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 8bcea7f..330f6f0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -33,7 +33,6 @@ float tf = 0.0f; double last_time = 0.0f; double delta_time = 0.0f; GLuint texture_array; -Player player; Camera camera; TextureManager texture_manager; World world; @@ -105,7 +104,7 @@ void init(GLFWwindow* window) { mv_loc = glGetUniformLocation(rendering_program, "mv_matrix"); proj_loc = glGetUniformLocation(rendering_program, "proj_matrix"); - camera.camera_init(&player); + camera.camera_init(&world.get_player("TestPlayer")); glfwGetFramebufferSize(window, &width, &height); aspect = (float)width / (float)height; glViewport(0, 0, width, height); @@ -144,7 +143,7 @@ void cursor_position_callback(GLFWwindow* window, double xpos, double ypos) { void display(GLFWwindow* window, double current_time) { delta_time = current_time - last_time; last_time = current_time; - player.update(delta_time); + world.update(delta_time); camera.update_move_camera(); @@ -183,7 +182,7 @@ void key_callback(GLFWwindow* window, int key, int scancode, int action, int mod } - player.update_player_move_state(key, action); + world.get_player("TestPlayer").update_player_move_state(key, action); }