From d8e1fc7aa333a99464b0c8a9a6c15632f1fb08d9 Mon Sep 17 00:00:00 2001 From: "Zed A. Shaw" Date: Thu, 20 Feb 2025 08:41:45 -0500 Subject: [PATCH] I have the overlay display the low health blood using the gui system. --- guecs.cpp | 14 +++++++++++--- guecs.hpp | 15 +++++++++++++++ gui.cpp | 9 +++------ overlay_ui.cpp | 22 +++++++++++++++++----- overlay_ui.hpp | 14 ++++---------- 5 files changed, 50 insertions(+), 24 deletions(-) diff --git a/guecs.cpp b/guecs.cpp index ebe1422..e940391 100644 --- a/guecs.cpp +++ b/guecs.cpp @@ -15,9 +15,17 @@ namespace guecs { } DinkyECS::Entity UI::entity(std::string name) { - auto entity = $world.entity(); - $world.set(entity, {name}); - return entity; + if($name_ents.contains(name)) { + // already exists so just return it + return $name_ents.at(name); + } else { + auto entity = $world.entity(); + // this lets you look up an entity by name + $name_ents.insert_or_assign(name, entity); + // this makes it easier to get the name during querying + $world.set(entity, {name}); + return entity; + } } void UI::init(TexturePack& textures) { diff --git a/guecs.hpp b/guecs.hpp index f68146b..e79f53b 100644 --- a/guecs.hpp +++ b/guecs.hpp @@ -126,6 +126,7 @@ namespace guecs { class UI { public: DinkyECS::World $world; + std::unordered_map $name_ents; shared_ptr $font = nullptr; lel::Parser $parser; std::string $grid = ""; @@ -147,6 +148,20 @@ namespace guecs { void init(TexturePack& textures); void render(sf::RenderWindow& window); void mouse(float x, float y); + + template + void set(DinkyECS::Entity ent, Comp val) { + $world.set(ent, val); + } + + lel::Cell& cell_for(DinkyECS::Entity entity) { + return $world.get(entity); + } + + template + void remove(DinkyECS::Entity ent) { + $world.remove(ent); + } }; Clickable make_action(DinkyECS::World& target, Events::GUI event); diff --git a/gui.cpp b/gui.cpp index 35962e3..9c28278 100644 --- a/gui.cpp +++ b/gui.cpp @@ -18,7 +18,7 @@ namespace gui { $map_view($level), $combat_view($level), $status_view($level), - $overlay_view($level), + $overlay_view($level, $textures), $font{FONT_FILE_NAME}, $text{$font}, $rayview($textures, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT) @@ -54,7 +54,7 @@ namespace gui { $rayview.position_camera($player.x + 0.5, $player.y + 0.5); $combat_view.render($textures); - $overlay_view.render($textures); + $overlay_view.render(); $status_view.render($textures); $status_view.log("Welcome to the game!"); @@ -301,10 +301,7 @@ namespace gui { auto player = $level.world->get_the(); auto player_combat = $level.world->get(player.entity); - if(float(player_combat.hp) / float(player_combat.max_hp) < 0.5) { - $overlay_view.set("middle", {"blood_splatter"}); - $overlay_view.$gui.init($textures); - } + $overlay_view.show_damage(float(player_combat.hp) / float(player_combat.max_hp) < 0.5); } void FSM::draw_gui() { diff --git a/overlay_ui.cpp b/overlay_ui.cpp index b03a517..d8dc4a8 100644 --- a/overlay_ui.cpp +++ b/overlay_ui.cpp @@ -6,8 +6,9 @@ namespace gui { using namespace guecs; - OverlayUI::OverlayUI(GameLevel level) : - $level(level) + OverlayUI::OverlayUI(GameLevel level, TexturePack& textures) : + $level(level), + $textures(textures) { $gui.position(RAY_VIEW_X, RAY_VIEW_Y, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT); $gui.layout( @@ -19,18 +20,29 @@ namespace gui { ); } - void OverlayUI::render(TexturePack &textures) { + void OverlayUI::render() { auto &world = $gui.world(); for(auto &[name, cell] : $gui.cells()) { auto region = $gui.entity(name); - $name_ents.insert_or_assign(name, region); world.set(region, cell); } - $gui.init(textures); + $gui.init($textures); } void OverlayUI::draw(sf::RenderWindow& window) { $gui.render(window); } + void OverlayUI::show_damage(bool show) { + auto middle = $gui.entity("middle"); + + if(show) { + Sprite blood{"blood_splatter"}; + auto& cell = $gui.cell_for(middle); + blood.init(cell, $textures); + $gui.set(middle, blood); + } else { + $gui.remove(middle); + } + } } diff --git a/overlay_ui.hpp b/overlay_ui.hpp index b847761..e6429b3 100644 --- a/overlay_ui.hpp +++ b/overlay_ui.hpp @@ -9,19 +9,13 @@ namespace gui { public: guecs::UI $gui; GameLevel $level; - std::unordered_map $name_ents; + TexturePack& $textures; - OverlayUI(GameLevel level); + OverlayUI(GameLevel level, TexturePack& $textures); - void render(TexturePack& texture); + void render(); void draw(sf::RenderWindow& window); void click(int x, int y); - - template - // this should be in the GUECS really - void set(std::string name, Comp val) { - auto ent = $name_ents.at(name); - $level.world->set(ent, val); - } + void show_damage(bool show); }; }