Mostly working overlay to show when in combat or not.
This commit is contained in:
parent
30a7e1b2cc
commit
4a1a8a7d65
4 changed files with 66 additions and 32 deletions
|
@ -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);
|
||||
|
|
15
gui.cpp
15
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<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::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>(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::init_stats() {
|
||||
auto top_left = $gui.entity("top_left");
|
||||
auto &cell = $gui.cell_for(top_left);
|
||||
Textual text{"", 20};
|
||||
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<Textual>(top_left, text);
|
||||
$gui.set<Label>(ent, text);
|
||||
}
|
||||
|
||||
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_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…
Add table
Add a link
Reference in a new issue