feat(ui): add HUD visibility toggle and image fill features

This commit is contained in:
2026-07-14 15:27:55 +08:00
parent 969c78ce5e
commit 618d3f1294
6 changed files with 93 additions and 41 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 MiB

View File

@@ -46,8 +46,10 @@ private:
std::shared_ptr<NetworkClient> m_client; std::shared_ptr<NetworkClient> m_client;
ClientWorld m_client_world; ClientWorld m_client_world;
bool m_paused = false; bool m_paused = false;
bool m_show_hud = true;
bool m_show_dev_pannel = true;
PauseMenuUIManager m_pasue_menu; PauseMenuUIManager m_pasue_menu;
WorldUIManager m_ui_manager; WorldUIManager m_hud_ui;
const Argument& m_argument; const Argument& m_argument;
}; };
} // namespace Cubed } // namespace Cubed

View File

@@ -21,8 +21,17 @@ public:
Image& set_scale(float scale); Image& set_scale(float scale);
float scale() const; float scale() const;
Image& set_height(float height);
Image& set_width(float width);
Image& set_fill(bool fill);
private: private:
void on_render(Renderer& renderer) override; void on_render(Renderer& renderer) override;
void on_update(float dt) override;
float m_width = 0.0f;
float m_height = 0.0f;
bool m_fill = false;
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};

View File

@@ -8,7 +8,7 @@ WorldScene::WorldScene(SceneManager& scene_manager)
: m_scene_manager(scene_manager), m_dev_panel(*this), : m_scene_manager(scene_manager), m_dev_panel(*this),
m_client_world(scene_manager.app().audio(), scene_manager.app().config(), m_client_world(scene_manager.app().audio(), scene_manager.app().config(),
*this), *this),
m_pasue_menu(*this), m_ui_manager(*this), m_pasue_menu(*this), m_hud_ui(*this),
m_argument(scene_manager.app().argument()) {} m_argument(scene_manager.app().argument()) {}
WorldScene::~WorldScene() { WorldScene::~WorldScene() {
@@ -18,41 +18,45 @@ WorldScene::~WorldScene() {
} }
void WorldScene::update(float dt) { void WorldScene::update(float dt) {
m_client_world.update(dt);
m_camera.update_move_camera();
m_client_world.get_audio().update_listener(m_camera.get_camera_pos(),
m_camera.get_camera_front(),
glm::vec3(0, 1, 0));
/*
const auto& player = m_client_world.get_player();
if (player_gait != player.get_gait()) {
player_gait = player.get_gait();
float fov = m_client_world.get("player.fov", 70.0f);
if (player_gait == Gait::WALK) {
m_renderer.update_fov(fov);
}
if (player_gait == Gait::RUN) {
m_renderer.update_fov(fov + 5.0f);
}
}*/
if (m_paused) { if (m_paused) {
m_pasue_menu.update(dt); m_pasue_menu.update(dt);
} else { } else {
m_client_world.update(dt);
m_camera.update_move_camera();
m_client_world.get_audio().update_listener(m_camera.get_camera_pos(),
m_camera.get_camera_front(),
glm::vec3(0, 1, 0));
/* m_hud_ui.update(dt);
const auto& player = m_client_world.get_player();
if (player_gait != player.get_gait()) {
player_gait = player.get_gait();
float fov = m_client_world.get("player.fov", 70.0f);
if (player_gait == Gait::WALK) {
m_renderer.update_fov(fov);
}
if (player_gait == Gait::RUN) {
m_renderer.update_fov(fov + 5.0f);
}
}*/
m_ui_manager.update(dt);
} }
} }
void WorldScene::render(Renderer& renderer) { void WorldScene::render(Renderer& renderer) {
renderer.render_world(m_client_world); renderer.render_world(m_client_world);
if (m_show_hud) {
m_ui_manager.render(renderer); m_hud_ui.render(renderer);
}
if (m_paused) { if (m_paused) {
m_pasue_menu.render(renderer); m_pasue_menu.render(renderer);
} else { } else {
renderer.render_dev_panel(m_dev_panel); if (m_show_dev_pannel && m_show_hud) {
renderer.render_dev_panel(m_dev_panel);
}
} }
} }
bool WorldScene::handle_event(const Event& e) { bool WorldScene::handle_event(const Event& e) {
@@ -110,7 +114,7 @@ void WorldScene::on_enter() {
m_scene_manager.app().window().set_camera(&m_camera); m_scene_manager.app().window().set_camera(&m_camera);
m_dev_panel.init(); m_dev_panel.init();
m_pasue_menu.init(); m_pasue_menu.init();
m_ui_manager.init(); m_hud_ui.init();
m_scene_manager.app().window().set_game_running(true); m_scene_manager.app().window().set_game_running(true);
} }
@@ -131,7 +135,7 @@ bool WorldScene::handle_mouse_move_event(const MouseMoveEvent& e) {
return true; return true;
} }
} else { } else {
if (m_ui_manager.handle_event(e)) { if (m_hud_ui.handle_event(e)) {
return true; return true;
} }
if (m_camera.handle_event(e)) { if (m_camera.handle_event(e)) {
@@ -151,7 +155,7 @@ bool WorldScene::handle_mouse_button_event(const MouseButtonEvent& e) {
return true; return true;
} }
} else { } else {
if (m_ui_manager.handle_event(e)) { if (m_hud_ui.handle_event(e)) {
return true; return true;
} }
if (m_camera.handle_event(e)) { if (m_camera.handle_event(e)) {
@@ -169,7 +173,7 @@ bool WorldScene::handle_window_resize_event(const WindowResizeEvent& e) {
if (m_pasue_menu.handle_event(e)) { if (m_pasue_menu.handle_event(e)) {
return true; return true;
} }
if (m_ui_manager.handle_event(e)) { if (m_hud_ui.handle_event(e)) {
return true; return true;
} }
if (m_camera.handle_event(e)) { if (m_camera.handle_event(e)) {
@@ -188,7 +192,7 @@ bool WorldScene::handle_mouse_wheel_event(const MouseWheelEvent& e) {
return true; return true;
} }
} else { } else {
if (m_ui_manager.handle_event(e)) { if (m_hud_ui.handle_event(e)) {
return true; return true;
} }
if (m_camera.handle_event(e)) { if (m_camera.handle_event(e)) {
@@ -209,12 +213,20 @@ bool WorldScene::handle_key_event(const KeyEvent& e) {
set_pause(pasued); set_pause(pasued);
return true; return true;
} }
if (e.key == Key::F1 && e.action == KeyAction::PRESS) {
m_show_hud = !m_show_hud;
return true;
}
if (e.key == Key::F12 && e.action == KeyAction::PRESS) {
m_show_dev_pannel = !m_show_dev_pannel;
return true;
}
if (m_paused) { if (m_paused) {
if (m_pasue_menu.handle_event(e)) { if (m_pasue_menu.handle_event(e)) {
return true; return true;
} }
} else { } else {
if (m_ui_manager.handle_event(e)) { if (m_hud_ui.handle_event(e)) {
return true; return true;
} }
if (m_camera.handle_event(e)) { if (m_camera.handle_event(e)) {

View File

@@ -7,10 +7,24 @@ namespace Cubed {
Image::Image(Widget* parent) : Widget(parent) {} Image::Image(Widget* parent) : Widget(parent) {}
void Image::on_render(Renderer& renderer) { renderer.render_image(*this); } void Image::on_render(Renderer& renderer) { renderer.render_image(*this); }
void Image::on_update(float) {
if (m_fill) {
if (m_fill) {
if (!m_parent) {
m_width = m_window_width;
m_height = m_window_height;
} else {
m_width = m_parent->width();
m_height = m_parent->height();
}
}
}
}
Image& Image::set_image(const std::string& path, Image& Image::set_image(const std::string& path,
TextureManager& texture_manager) { TextureManager& texture_manager) {
m_texture = texture_manager.get_image_texture(path); m_texture = texture_manager.get_image_texture(path);
m_width = m_texture->width();
m_height = m_texture->height();
return *this; return *this;
} }
Image& Image::set_scale(float scale) { Image& Image::set_scale(float scale) {
@@ -23,7 +37,7 @@ float Image::height() const {
Logger::error("Image id {} not set image!", m_id); Logger::error("Image id {} not set image!", m_id);
return 0.0f; return 0.0f;
} }
return m_texture->height() * m_scale; return m_height * m_scale;
} }
float Image::width() const { float Image::width() const {
@@ -31,7 +45,21 @@ float Image::width() const {
Logger::error("Image id {} not set image!", m_id); Logger::error("Image id {} not set image!", m_id);
return 0.0f; return 0.0f;
} }
return m_texture->width() * m_scale; return m_width * m_scale;
}
Image& Image::set_height(float height) {
m_height = height;
return *this;
}
Image& Image ::set_width(float width) {
m_width = width;
return *this;
}
Image& Image::set_fill(bool fill) {
m_fill = fill;
return *this;
} }
const Texture* Image::texture() const { return m_texture; } const Texture* Image::texture() const { return m_texture; }

View File

@@ -13,15 +13,16 @@ MainMenuUIManager::~MainMenuUIManager() {}
void MainMenuUIManager::init() { void MainMenuUIManager::init() {
auto rect = std::make_unique<Rect>(nullptr); auto image = std::make_unique<Image>(nullptr);
rect->set_fill(true); image->set_fill(true);
rect->set_anchor(Anchor::TOP_LEFT); image->set_anchor(Anchor::TOP_LEFT);
rect->set_color(Color::WHITE); image->set_image("texture/ui/background.png",
m_scene.scene_manager().app().texture_manager());
auto& renderer = m_scene.scene_manager().app().renderer(); auto& renderer = m_scene.scene_manager().app().renderer();
rect->set_window_size(renderer.window_width(), renderer.window_height()); image->set_window_size(renderer.window_width(), renderer.window_height());
auto& layout = rect->add_child<ColumnLayout>(); auto& layout = image->add_child<ColumnLayout>();
layout.set_spacing(20); layout.set_spacing(20);
layout.set_anchor(Anchor::CENTER); layout.set_anchor(Anchor::CENTER);
layout.set_window_size(renderer.window_width(), renderer.window_height()); layout.set_window_size(renderer.window_width(), renderer.window_height());
@@ -53,9 +54,9 @@ void MainMenuUIManager::init() {
m_scene.scene_manager().app().window().should_close_window(); m_scene.scene_manager().app().window().should_close_window();
}); });
} }
m_widgets.try_emplace("background", rect.get()); m_widgets.try_emplace("background", image.get());
m_widgets.try_emplace("main menu layout", &layout); m_widgets.try_emplace("main menu layout", &layout);
m_root_widget = std::move(rect); m_root_widget = std::move(image);
} }
} // namespace Cubed } // namespace Cubed