From 527178e067d90d74bff71cad709463a180cbffbc Mon Sep 17 00:00:00 2001 From: zhenyan121 <3367366583@qq.com> Date: Mon, 20 Jul 2026 18:35:37 +0800 Subject: [PATCH] feat(ui): add microphone icon when recording voice --- assets/texture/ui/microphone.png | Bin 0 -> 137 bytes include/Cubed/audio/audio_engine.hpp | 1 + include/Cubed/gameplay/client_world.hpp | 1 + include/Cubed/scene/world_scene.hpp | 2 ++ include/Cubed/ui/world_ui_manager.hpp | 7 +++++-- src/audio/audio_engine.cpp | 4 +++- src/gameplay/client_world.cpp | 1 + src/gameplay/server_world.cpp | 2 -- src/scene/world_scene.cpp | 4 +++- src/ui/world_ui_manager.cpp | 23 ++++++++++++++++++----- 10 files changed, 34 insertions(+), 11 deletions(-) create mode 100644 assets/texture/ui/microphone.png diff --git a/assets/texture/ui/microphone.png b/assets/texture/ui/microphone.png new file mode 100644 index 0000000000000000000000000000000000000000..60d09d71dbc8405261cc1c8e3d4b086554b366fa GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|oIPC}Lo9le z6BZc$;6G}?sLXhl<*L!dr|TYOGu*r2#$2%VN6dkaX5R}bHF}CO^a?apqLfdX@zt0l iamPB7b~X-Z9D}E;pUXO@geCw5tSOuT literal 0 HcmV?d00001 diff --git a/include/Cubed/audio/audio_engine.hpp b/include/Cubed/audio/audio_engine.hpp index 56e6933..09b5a1c 100644 --- a/include/Cubed/audio/audio_engine.hpp +++ b/include/Cubed/audio/audio_engine.hpp @@ -51,6 +51,7 @@ public: void receive_voice(std::span opus, const glm::vec3& pos); AudioRecording& audio_recording(); + const AudioRecording& audio_recording() const; private: using FadeMap = std::unordered_map; diff --git a/include/Cubed/gameplay/client_world.hpp b/include/Cubed/gameplay/client_world.hpp index 158a26d..e1fbf8c 100644 --- a/include/Cubed/gameplay/client_world.hpp +++ b/include/Cubed/gameplay/client_world.hpp @@ -100,6 +100,7 @@ public: int chunk_size() const; static AABB get_block_aabb(const glm::ivec3& pos); AudioEngine& get_audio(); + const AudioEngine& get_audio() const; Config& get_config(); WorldScene& world_scene(); void set_direct_exit(); diff --git a/include/Cubed/scene/world_scene.hpp b/include/Cubed/scene/world_scene.hpp index 459153d..f789a76 100644 --- a/include/Cubed/scene/world_scene.hpp +++ b/include/Cubed/scene/world_scene.hpp @@ -39,6 +39,8 @@ public: // Not thread safe void handle_chat_message(ChatMessage& message); + bool is_recording() const; + private: SceneManager& m_scene_manager; DevPanel m_dev_panel; diff --git a/include/Cubed/ui/world_ui_manager.hpp b/include/Cubed/ui/world_ui_manager.hpp index 29ad6b1..951f6e4 100644 --- a/include/Cubed/ui/world_ui_manager.hpp +++ b/include/Cubed/ui/world_ui_manager.hpp @@ -1,6 +1,7 @@ #pragma once #include "Cubed/ui/chat_box.hpp" +#include "Cubed/ui/image.hpp" #include "Cubed/ui/ui_manager.hpp" #include "Cubed/ui/widget.hpp" @@ -18,7 +19,7 @@ public: void init() override; void render(Renderer& renderer) override; - + void update(float dt) override; void set_chatting(bool chantting, bool sned); void add_chat_message(ChatMessage& message); @@ -26,6 +27,8 @@ public: private: bool handle_key_event(const KeyEvent& e) override; WorldScene& m_scene; - ChatBox* m_chat_box; + + ChatBox* m_chat_box = nullptr; + Image* m_mircophone = nullptr; }; } // namespace Cubed \ No newline at end of file diff --git a/src/audio/audio_engine.cpp b/src/audio/audio_engine.cpp index fddc45d..efe553d 100644 --- a/src/audio/audio_engine.cpp +++ b/src/audio/audio_engine.cpp @@ -302,5 +302,7 @@ void AudioEngine::receive_voice(std::span opus, } AudioRecording& AudioEngine::audio_recording() { return m_recording; } - +const AudioRecording& AudioEngine::audio_recording() const { + return m_recording; +} } // namespace Cubed \ No newline at end of file diff --git a/src/gameplay/client_world.cpp b/src/gameplay/client_world.cpp index 4c1d460..9452988 100644 --- a/src/gameplay/client_world.cpp +++ b/src/gameplay/client_world.cpp @@ -726,6 +726,7 @@ AABB ClientWorld::get_block_aabb(const glm::ivec3& pos) { } AudioEngine& ClientWorld::get_audio() { return m_audio; } +const AudioEngine& ClientWorld::get_audio() const { return m_audio; } Config& ClientWorld::get_config() { return m_config; } WorldScene& ClientWorld::world_scene() { return m_world_scene; } void ClientWorld::set_direct_exit() { m_exit_direct = true; } diff --git a/src/gameplay/server_world.cpp b/src/gameplay/server_world.cpp index 9748bee..6416c9d 100644 --- a/src/gameplay/server_world.cpp +++ b/src/gameplay/server_world.cpp @@ -773,7 +773,6 @@ void ServerWorld::handle_chat_message(ChatMsg& msg) { } void ServerWorld::handle_voice_message(VoiceMsg& msg) { - Logger::info("Get voice Message"); auto pool = m_net_thread_pool.load(); std::string uuid = msg.uuid(); std::string data = msg.opus_data(); @@ -806,7 +805,6 @@ void ServerWorld::handle_voice_message(VoiceMsg& msg) { for (auto& s : session) { s->send(make_packet(*msg), 5); } - Logger::info("Send voice message sum {}", session.size()); }); } diff --git a/src/scene/world_scene.cpp b/src/scene/world_scene.cpp index 7980bd3..c06521b 100644 --- a/src/scene/world_scene.cpp +++ b/src/scene/world_scene.cpp @@ -394,7 +394,9 @@ void WorldScene::set_chatting(bool chatting, bool send) { void WorldScene::handle_chat_message(ChatMessage& message) { m_hud_ui.add_chat_message(message); } - +bool WorldScene::is_recording() const { + return m_client_world.get_audio().audio_recording().is_recording(); +} void WorldScene::set_error(std::string_view error) { Logger::error("WorldScene Error Set {}", error); m_error_ui.set_error(error); diff --git a/src/ui/world_ui_manager.cpp b/src/ui/world_ui_manager.cpp index 75eecf7..2b4c9c9 100644 --- a/src/ui/world_ui_manager.cpp +++ b/src/ui/world_ui_manager.cpp @@ -20,13 +20,11 @@ void WorldUIManager::init() { m_root_widget->set_window_size(renderer.window_width(), renderer.window_height()); - + auto& texture_manager = m_scene.scene_manager().app().texture_manager(); auto& crosshair = m_root_widget->add_child(); - crosshair.set_image("texture/ui/0.png", - m_scene.scene_manager().app().texture_manager()); - crosshair.set_window_size(renderer.window_width(), - renderer.window_height()); + crosshair.set_image("texture/ui/0.png", texture_manager); + crosshair.set_anchor(Anchor::CENTER); crosshair.set_scale(3.0f); m_widgets.try_emplace("crosshair", &crosshair); @@ -57,6 +55,12 @@ void WorldUIManager::init() { m_scene.client_world().send_chat_message(message); }); m_chat_box = &chat_box; + auto& microphone = m_root_widget->add_child(); + microphone.set_image("texture/ui/microphone.png", texture_manager) + .set_scale(5.0f) + .set_anchor(Anchor::BOTTOM_RIGHT) + .set_visible(false); + m_mircophone = µphone; } void WorldUIManager::render(Renderer& renderer) { renderer.begin_render_ui(); @@ -68,6 +72,15 @@ void WorldUIManager::render(Renderer& renderer) { renderer.end_render_ui(); } +void WorldUIManager::update(float dt) { + UIManager::update(dt); + if (m_scene.is_recording()) { + m_mircophone->set_visible(true); + } else { + m_mircophone->set_visible(false); + } +} + void WorldUIManager::set_chatting(bool chantting, bool send) { m_chat_box->set_typing(chantting, send);