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);
|
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>
|
template <typename Comp>
|
||||||
void remove(DinkyECS::Entity ent) {
|
void remove(DinkyECS::Entity ent) {
|
||||||
$world.remove<Comp>(ent);
|
$world.remove<Comp>(ent);
|
||||||
|
|
15
gui.cpp
15
gui.cpp
|
@ -157,6 +157,7 @@ namespace gui {
|
||||||
state(State::ATTACKING);
|
state(State::ATTACKING);
|
||||||
break;
|
break;
|
||||||
case START_COMBAT:
|
case START_COMBAT:
|
||||||
|
$overlay_view.show_sprite("top_right", "cinqueda");
|
||||||
state(State::IN_COMBAT);
|
state(State::IN_COMBAT);
|
||||||
break;
|
break;
|
||||||
case CLOSE:
|
case CLOSE:
|
||||||
|
@ -188,6 +189,7 @@ namespace gui {
|
||||||
state(State::COMBAT_ROTATE);
|
state(State::COMBAT_ROTATE);
|
||||||
break;
|
break;
|
||||||
case STOP_COMBAT:
|
case STOP_COMBAT:
|
||||||
|
$overlay_view.close_sprite("top_right");
|
||||||
state(State::IDLE);
|
state(State::IDLE);
|
||||||
break;
|
break;
|
||||||
case QUIT:
|
case QUIT:
|
||||||
|
@ -273,10 +275,10 @@ namespace gui {
|
||||||
auto& player_combat = $level.world->get<Combat>(player.entity);
|
auto& player_combat = $level.world->get<Combat>(player.entity);
|
||||||
player_combat.hp = player_combat.max_hp;
|
player_combat.hp = player_combat.max_hp;
|
||||||
$combat_view.set_damage(float(player_combat.hp) / float(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 {
|
} else {
|
||||||
// it's off now, close it
|
// 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,
|
$stats.max, $stats.n, VSYNC,
|
||||||
FRAME_LIMIT, DEBUG_BUILD);
|
FRAME_LIMIT, DEBUG_BUILD);
|
||||||
|
|
||||||
$overlay_view.draw_stats(stats);
|
$overlay_view.update_text("top_left", stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
void FSM::draw_blood() {
|
void FSM::draw_blood() {
|
||||||
auto player = $level.world->get_the<Player>();
|
auto player = $level.world->get_the<Player>();
|
||||||
auto player_combat = $level.world->get<Combat>(player.entity);
|
auto player_combat = $level.world->get<Combat>(player.entity);
|
||||||
|
if(float(player_combat.hp) / float(player_combat.max_hp) < 0.5) {
|
||||||
$overlay_view.show_damage(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() {
|
void FSM::draw_gui() {
|
||||||
|
|
|
@ -2,9 +2,11 @@
|
||||||
#include "constants.hpp"
|
#include "constants.hpp"
|
||||||
#include "color.hpp"
|
#include "color.hpp"
|
||||||
#include "events.hpp"
|
#include "events.hpp"
|
||||||
|
#include <optional>
|
||||||
|
|
||||||
namespace gui {
|
namespace gui {
|
||||||
using namespace guecs;
|
using namespace guecs;
|
||||||
|
using std::string;
|
||||||
|
|
||||||
OverlayUI::OverlayUI(GameLevel level, TexturePack& textures) :
|
OverlayUI::OverlayUI(GameLevel level, TexturePack& textures) :
|
||||||
$level(level),
|
$level(level),
|
||||||
|
@ -33,36 +35,51 @@ namespace gui {
|
||||||
$gui.render(window);
|
$gui.render(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OverlayUI::show_damage(bool show) {
|
void OverlayUI::show_sprite(string region, string sprite_name) {
|
||||||
auto middle = $gui.entity("middle");
|
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) {
|
void OverlayUI::close_sprite(string region) {
|
||||||
Sprite blood{"blood_splatter"};
|
auto ent = $gui.entity(region);
|
||||||
auto& cell = $gui.cell_for(middle);
|
$gui.remove<guecs::Sprite>(ent);
|
||||||
blood.init(cell, $textures);
|
}
|
||||||
$gui.set<guecs::Sprite>(middle, blood);
|
|
||||||
} else {
|
void OverlayUI::show_text(string region, string content) {
|
||||||
$gui.remove<guecs::Sprite>(middle);
|
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() {
|
void OverlayUI::close_text(string region) {
|
||||||
auto top_left = $gui.entity("top_left");
|
auto ent = $gui.entity(region);
|
||||||
auto &cell = $gui.cell_for(top_left);
|
$gui.remove<Textual>(ent);
|
||||||
Textual text{"", 20};
|
}
|
||||||
|
|
||||||
|
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.init(cell, $gui.$font);
|
||||||
text.text->setFillColor(ColorValue::LIGHT_MID);
|
text.text->setFillColor(ColorValue::LIGHT_MID);
|
||||||
$gui.set<Textual>(top_left, text);
|
$gui.set<Label>(ent, text);
|
||||||
}
|
}
|
||||||
|
|
||||||
void OverlayUI::draw_stats(std::string stats) {
|
void OverlayUI::close_label(string region) {
|
||||||
auto top_left = $gui.entity("top_left");
|
auto ent = $gui.entity(region);
|
||||||
auto& text = $gui.get<Textual>(top_left);
|
$gui.remove<Label>(ent);
|
||||||
text.text->setString(stats);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OverlayUI::close_stats() {
|
|
||||||
auto top_left = $gui.entity("top_left");
|
|
||||||
$gui.remove<Textual>(top_left);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,9 +16,12 @@ namespace gui {
|
||||||
void render();
|
void render();
|
||||||
void draw(sf::RenderWindow& window);
|
void draw(sf::RenderWindow& window);
|
||||||
void click(int x, int y);
|
void click(int x, int y);
|
||||||
void show_damage(bool show);
|
void show_sprite(string region, string sprite_name);
|
||||||
void init_stats();
|
void close_sprite(string region);
|
||||||
void draw_stats(std::string stats);
|
void show_text(std::string region, std::string content);
|
||||||
void close_stats();
|
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