diff --git a/guecs.hpp b/guecs.hpp index 55aae48..651963c 100644 --- a/guecs.hpp +++ b/guecs.hpp @@ -163,6 +163,15 @@ namespace guecs { return $world.get(entity); } + template + std::optional get_if(DinkyECS::Entity entity) { + if($world.has(entity)) { + return std::make_optional($world.get(entity)); + } else { + return std::nullopt; + } + } + template void remove(DinkyECS::Entity ent) { $world.remove(ent); diff --git a/gui.cpp b/gui.cpp index ffc7f97..888b76c 100644 --- a/gui.cpp +++ b/gui.cpp @@ -157,6 +157,7 @@ namespace gui { state(State::ATTACKING); break; case START_COMBAT: + $overlay_view.show_sprite("top_right", "cinqueda"); state(State::IN_COMBAT); break; case CLOSE: @@ -188,6 +189,7 @@ namespace gui { state(State::COMBAT_ROTATE); break; case STOP_COMBAT: + $overlay_view.close_sprite("top_right"); state(State::IDLE); break; case QUIT: @@ -273,10 +275,10 @@ namespace gui { auto& player_combat = $level.world->get(player.entity); player_combat.hp = player_combat.max_hp; $combat_view.set_damage(float(player_combat.hp) / float(player_combat.max_hp)); - $overlay_view.init_stats(); + $overlay_view.show_text("top_left", "STATS"); } else { // it's off now, close it - $overlay_view.close_stats(); + $overlay_view.close_text("top_left"); } } @@ -297,14 +299,17 @@ namespace gui { $stats.max, $stats.n, VSYNC, FRAME_LIMIT, DEBUG_BUILD); - $overlay_view.draw_stats(stats); + $overlay_view.update_text("top_left", stats); } void FSM::draw_blood() { auto player = $level.world->get_the(); auto player_combat = $level.world->get(player.entity); - - $overlay_view.show_damage(float(player_combat.hp) / float(player_combat.max_hp) < 0.5); + if(float(player_combat.hp) / float(player_combat.max_hp) < 0.5) { + $overlay_view.show_sprite("middle", "blood_splatter"); + } else { + $overlay_view.close_sprite("middle"); + } } void FSM::draw_gui() { diff --git a/overlay_ui.cpp b/overlay_ui.cpp index 8b400a1..84ef1df 100644 --- a/overlay_ui.cpp +++ b/overlay_ui.cpp @@ -2,9 +2,11 @@ #include "constants.hpp" #include "color.hpp" #include "events.hpp" +#include namespace gui { using namespace guecs; + using std::string; OverlayUI::OverlayUI(GameLevel level, TexturePack& textures) : $level(level), @@ -33,36 +35,51 @@ namespace gui { $gui.render(window); } - void OverlayUI::show_damage(bool show) { - auto middle = $gui.entity("middle"); + void OverlayUI::show_sprite(string region, string sprite_name) { + auto ent = $gui.entity(region); + Sprite blood{sprite_name}; + auto& cell = $gui.cell_for(ent); + blood.init(cell, $textures); + $gui.set(ent, blood); + } - if(show) { - Sprite blood{"blood_splatter"}; - auto& cell = $gui.cell_for(middle); - blood.init(cell, $textures); - $gui.set(middle, blood); - } else { - $gui.remove(middle); - } + void OverlayUI::close_sprite(string region) { + auto ent = $gui.entity(region); + $gui.remove(ent); } - void OverlayUI::init_stats() { - auto top_left = $gui.entity("top_left"); - auto &cell = $gui.cell_for(top_left); - Textual text{"", 20}; + void OverlayUI::show_text(string region, string content) { + auto ent = $gui.entity(region); + auto &cell = $gui.cell_for(ent); + Textual text{content, 20}; text.init(cell, $gui.$font); text.text->setFillColor(ColorValue::LIGHT_MID); - $gui.set(top_left, text); + $gui.set(ent, text); + } + + void OverlayUI::update_text(string region, string content) { + auto ent = $gui.entity(region); + if(auto text = $gui.get_if(ent)) { + text->text->setString(content); + } } - void OverlayUI::draw_stats(std::string stats) { - auto top_left = $gui.entity("top_left"); - auto& text = $gui.get(top_left); - text.text->setString(stats); + void OverlayUI::close_text(string region) { + auto ent = $gui.entity(region); + $gui.remove(ent); + } + + void OverlayUI::show_label(string region, string content) { + auto ent = $gui.entity(region); + auto &cell = $gui.cell_for(ent); + Label text{content, 20}; + text.init(cell, $gui.$font); + text.text->setFillColor(ColorValue::LIGHT_MID); + $gui.set