Mostly working overlay to show when in combat or not.

master
Zed A. Shaw 2 weeks ago
parent 30a7e1b2cc
commit 4a1a8a7d65
  1. 9
      guecs.hpp
  2. 15
      gui.cpp
  3. 61
      overlay_ui.cpp
  4. 11
      overlay_ui.hpp

@ -163,6 +163,15 @@ namespace guecs {
return $world.get<Comp>(entity);
}
template <typename Comp>
std::optional<Comp> get_if(DinkyECS::Entity entity) {
if($world.has<Comp>(entity)) {
return std::make_optional<Comp>($world.get<Comp>(entity));
} else {
return std::nullopt;
}
}
template <typename Comp>
void remove(DinkyECS::Entity ent) {
$world.remove<Comp>(ent);

@ -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<Combat>(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<Player>();
auto player_combat = $level.world->get<Combat>(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() {

@ -2,9 +2,11 @@
#include "constants.hpp"
#include "color.hpp"
#include "events.hpp"
#include <optional>
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<guecs::Sprite>(ent, blood);
}
if(show) {
Sprite blood{"blood_splatter"};
auto& cell = $gui.cell_for(middle);
blood.init(cell, $textures);
$gui.set<guecs::Sprite>(middle, blood);
} else {
$gui.remove<guecs::Sprite>(middle);
}
void OverlayUI::close_sprite(string region) {
auto ent = $gui.entity(region);
$gui.remove<guecs::Sprite>(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<Textual>(top_left, text);
$gui.set<Textual>(ent, text);
}
void OverlayUI::update_text(string region, string content) {
auto ent = $gui.entity(region);
if(auto text = $gui.get_if<Textual>(ent)) {
text->text->setString(content);
}
}
void OverlayUI::draw_stats(std::string stats) {
auto top_left = $gui.entity("top_left");
auto& text = $gui.get<Textual>(top_left);
text.text->setString(stats);
void OverlayUI::close_text(string region) {
auto ent = $gui.entity(region);
$gui.remove<Textual>(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<Label>(ent, text);
}
void OverlayUI::close_stats() {
auto top_left = $gui.entity("top_left");
$gui.remove<Textual>(top_left);
void OverlayUI::close_label(string region) {
auto ent = $gui.entity(region);
$gui.remove<Label>(ent);
}
}

@ -16,9 +16,12 @@ namespace gui {
void render();
void draw(sf::RenderWindow& window);
void click(int x, int y);
void show_damage(bool show);
void init_stats();
void draw_stats(std::string stats);
void close_stats();
void show_sprite(string region, string sprite_name);
void close_sprite(string region);
void show_text(std::string region, std::string content);
void update_text(std::string region, std::string content);
void close_text(std::string region);
void show_label(std::string region, std::string content);
void close_label(std::string region);
};
}

Loading…
Cancel
Save