mirror of
https://github.com/zhenyan121/Cubed.git
synced 2026-08-09 02:07:04 +08:00
feat(ui): add HUD visibility toggle and image fill features
This commit is contained in:
BIN
assets/texture/ui/background.png
Normal file
BIN
assets/texture/ui/background.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.3 MiB |
@@ -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
|
||||||
@@ -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};
|
||||||
|
|||||||
@@ -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)) {
|
||||||
|
|||||||
@@ -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; }
|
||||||
|
|||||||
@@ -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
|
||||||
Reference in New Issue
Block a user