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;
ClientWorld m_client_world;
bool m_paused = false;
bool m_show_hud = true;
bool m_show_dev_pannel = true;
PauseMenuUIManager m_pasue_menu;
WorldUIManager m_ui_manager;
WorldUIManager m_hud_ui;
const Argument& m_argument;
};
} // namespace Cubed

View File

@@ -21,8 +21,17 @@ public:
Image& set_scale(float scale);
float scale() const;
Image& set_height(float height);
Image& set_width(float width);
Image& set_fill(bool fill);
private:
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;
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_client_world(scene_manager.app().audio(), scene_manager.app().config(),
*this),
m_pasue_menu(*this), m_ui_manager(*this),
m_pasue_menu(*this), m_hud_ui(*this),
m_argument(scene_manager.app().argument()) {}
WorldScene::~WorldScene() {
@@ -18,9 +18,7 @@ WorldScene::~WorldScene() {
}
void WorldScene::update(float dt) {
if (m_paused) {
m_pasue_menu.update(dt);
} else {
m_client_world.update(dt);
m_camera.update_move_camera();
m_client_world.get_audio().update_listener(m_camera.get_camera_pos(),
@@ -39,21 +37,27 @@ void WorldScene::update(float dt) {
m_renderer.update_fov(fov + 5.0f);
}
}*/
m_ui_manager.update(dt);
if (m_paused) {
m_pasue_menu.update(dt);
} else {
m_hud_ui.update(dt);
}
}
void WorldScene::render(Renderer& renderer) {
renderer.render_world(m_client_world);
m_ui_manager.render(renderer);
if (m_show_hud) {
m_hud_ui.render(renderer);
}
if (m_paused) {
m_pasue_menu.render(renderer);
} else {
if (m_show_dev_pannel && m_show_hud) {
renderer.render_dev_panel(m_dev_panel);
}
}
}
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_dev_panel.init();
m_pasue_menu.init();
m_ui_manager.init();
m_hud_ui.init();
m_scene_manager.app().window().set_game_running(true);
}
@@ -131,7 +135,7 @@ bool WorldScene::handle_mouse_move_event(const MouseMoveEvent& e) {
return true;
}
} else {
if (m_ui_manager.handle_event(e)) {
if (m_hud_ui.handle_event(e)) {
return true;
}
if (m_camera.handle_event(e)) {
@@ -151,7 +155,7 @@ bool WorldScene::handle_mouse_button_event(const MouseButtonEvent& e) {
return true;
}
} else {
if (m_ui_manager.handle_event(e)) {
if (m_hud_ui.handle_event(e)) {
return true;
}
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)) {
return true;
}
if (m_ui_manager.handle_event(e)) {
if (m_hud_ui.handle_event(e)) {
return true;
}
if (m_camera.handle_event(e)) {
@@ -188,7 +192,7 @@ bool WorldScene::handle_mouse_wheel_event(const MouseWheelEvent& e) {
return true;
}
} else {
if (m_ui_manager.handle_event(e)) {
if (m_hud_ui.handle_event(e)) {
return true;
}
if (m_camera.handle_event(e)) {
@@ -209,12 +213,20 @@ bool WorldScene::handle_key_event(const KeyEvent& e) {
set_pause(pasued);
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_pasue_menu.handle_event(e)) {
return true;
}
} else {
if (m_ui_manager.handle_event(e)) {
if (m_hud_ui.handle_event(e)) {
return true;
}
if (m_camera.handle_event(e)) {

View File

@@ -7,10 +7,24 @@ namespace Cubed {
Image::Image(Widget* parent) : Widget(parent) {}
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,
TextureManager& texture_manager) {
m_texture = texture_manager.get_image_texture(path);
m_width = m_texture->width();
m_height = m_texture->height();
return *this;
}
Image& Image::set_scale(float scale) {
@@ -23,7 +37,7 @@ float Image::height() const {
Logger::error("Image id {} not set image!", m_id);
return 0.0f;
}
return m_texture->height() * m_scale;
return m_height * m_scale;
}
float Image::width() const {
@@ -31,7 +45,21 @@ float Image::width() const {
Logger::error("Image id {} not set image!", m_id);
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; }

View File

@@ -13,15 +13,16 @@ MainMenuUIManager::~MainMenuUIManager() {}
void MainMenuUIManager::init() {
auto rect = std::make_unique<Rect>(nullptr);
auto image = std::make_unique<Image>(nullptr);
rect->set_fill(true);
rect->set_anchor(Anchor::TOP_LEFT);
rect->set_color(Color::WHITE);
image->set_fill(true);
image->set_anchor(Anchor::TOP_LEFT);
image->set_image("texture/ui/background.png",
m_scene.scene_manager().app().texture_manager());
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_anchor(Anchor::CENTER);
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_widgets.try_emplace("background", rect.get());
m_widgets.try_emplace("background", image.get());
m_widgets.try_emplace("main menu layout", &layout);
m_root_widget = std::move(rect);
m_root_widget = std::move(image);
}
} // namespace Cubed