From 18090bfd953d16663e60dd163ad6416bacf4bc56 Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Fri, 26 Jun 2026 22:15:31 +0800 Subject: [PATCH] refactor(gameplay): rename remote player types and add interpolation --- include/Cubed/gameplay/client_world.hpp | 18 ++++++++++-------- src/gameplay/client_world.cpp | 21 +++++++++++++++------ src/gameplay/network_client.cpp | 2 +- src/renderer.cpp | 4 ++-- 4 files changed, 28 insertions(+), 17 deletions(-) diff --git a/include/Cubed/gameplay/client_world.hpp b/include/Cubed/gameplay/client_world.hpp index 8b744a3..677c228 100644 --- a/include/Cubed/gameplay/client_world.hpp +++ b/include/Cubed/gameplay/client_world.hpp @@ -11,14 +11,15 @@ #include namespace Cubed { -struct OtherPlayerInfo { +struct RemotePlayerInfo { std::string name; - glm::vec3 pos; + glm::vec3 render_pos; + glm::vec3 target_pos; }; -struct RenderPlayerData { +struct RemotePlayerRenderData { std::string name; - glm::vec3 pos; + glm::vec3 render_pos; }; class ClientWorld { @@ -45,7 +46,7 @@ public: void receive_block_change(const BlockChangeRsp& rsp); void receive_time(const UpdateTime& rsp); - void receive_other_player(const PlayerInfoRsp& rsp); + void receive_remote_player(const PlayerInfoRsp& rsp); void receive_player_logout(const LogoutRsp& rsp); int rendering_distance() const; void rendering_distance(int rendering_distance); @@ -59,7 +60,7 @@ public: void request_chunk(); std::vector& planes(); const std::vector& render_snapshots() const; - const std::vector& render_player_data() const; + const std::vector& render_player_data() const; glm::vec3 sunlight_dir() const; void receive_chunk(ChunkDataRsp data); void exit(); @@ -76,7 +77,8 @@ private: tbb::concurrent_unordered_map; using ChunkPosSet = std::unordered_set; using ChunkPosVector = std::vector; - using OtherPlayerHashMap = std::unordered_map; + using OtherPlayerHashMap = + std::unordered_map; ClientPlayer m_player; OtherPlayerHashMap m_other_players; ChunkHashMap m_chunks; @@ -96,7 +98,7 @@ private: std::deque m_dirty_queue; std::vector m_render_snapshots; - std::vector m_render_player_data; + std::vector m_render_player_data; tbb::concurrent_unordered_map m_timers; std::atomic m_game_running{false}; std::atomic m_rendering_distance{24}; diff --git a/src/gameplay/client_world.cpp b/src/gameplay/client_world.cpp index 08e3c55..8785af3 100644 --- a/src/gameplay/client_world.cpp +++ b/src/gameplay/client_world.cpp @@ -192,12 +192,18 @@ void ClientWorld::receive_time(const UpdateTime& rsp) { m_day_tick = rsp.day_tick(); } -void ClientWorld::receive_other_player(const PlayerInfoRsp& rsp) { +void ClientWorld::receive_remote_player(const PlayerInfoRsp& rsp) { { std::lock_guard lock(m_other_players_mutex); - m_other_players[rsp.uuid()].name = rsp.name(); - m_other_players[rsp.uuid()].pos = - glm::vec3{rsp.pos().x(), rsp.pos().y(), rsp.pos().z()}; + glm::vec3 pos{rsp.pos().x(), rsp.pos().y(), rsp.pos().z()}; + auto it = m_other_players.find(rsp.uuid()); + if (it == m_other_players.end()) { + m_other_players.emplace( + std::piecewise_construct, std::forward_as_tuple(rsp.uuid()), + std::forward_as_tuple(rsp.name(), pos, pos)); + } else { + it->second.target_pos = pos; + } // Logger::info("Player {} pos Update", rsp.name()); } } @@ -509,7 +515,9 @@ void ClientWorld::update(float delta_time) { { std::lock_guard lock(m_other_players_mutex); for (auto& [uuid, player] : m_other_players) { - m_render_player_data.emplace_back(player.name, player.pos); + player.render_pos = + glm::mix(player.render_pos, player.target_pos, 0.15f); + m_render_player_data.emplace_back(player.name, player.render_pos); } } } @@ -541,7 +549,8 @@ void ClientWorld::rendering_distance(int rendering_distance) { const std::vector& ClientWorld::render_snapshots() const { return m_render_snapshots; }; -const std::vector& ClientWorld::render_player_data() const { +const std::vector& +ClientWorld::render_player_data() const { return m_render_player_data; } std::vector& ClientWorld::planes() { return m_planes; } diff --git a/src/gameplay/network_client.cpp b/src/gameplay/network_client.cpp index b10f3bd..a17e57c 100644 --- a/src/gameplay/network_client.cpp +++ b/src/gameplay/network_client.cpp @@ -100,7 +100,7 @@ asio::awaitable NetworkClient::read_loop() { case to_num(PacketEnum::PLAYER_INFO_RSP): { auto* rsp = Arena::Create(&arena); if (decode_packet(*rsp, body_data, header)) { - m_world.receive_other_player(*rsp); + m_world.receive_remote_player(*rsp); } } break; case to_num(PacketEnum::LOGOUT_RSP): { diff --git a/src/renderer.cpp b/src/renderer.cpp index d0a903a..41708dd 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -949,8 +949,8 @@ void Renderer::render_player() { auto& players = m_world.render_player_data(); for (auto& player : players) { - m_m_mat = glm::translate(glm::mat4(1.0f), - player.pos + glm::vec3(-0.5f, 0.0f, -0.5f)); + m_m_mat = glm::translate( + glm::mat4(1.0f), player.render_pos + glm::vec3(-0.5f, 0.0f, -0.5f)); m_mv_mat = m_v_mat * m_m_mat; shader.set_loc("mv_matrix", m_mv_mat); shader.set_loc("proj_matrix", m_p_mat);