I have the overlay display the low health blood using the gui system.
This commit is contained in:
parent
70a9420c11
commit
d8e1fc7aa3
5 changed files with 50 additions and 24 deletions
|
@ -15,10 +15,18 @@ namespace guecs {
|
|||
}
|
||||
|
||||
DinkyECS::Entity UI::entity(std::string name) {
|
||||
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<CellName>(entity, {name});
|
||||
return entity;
|
||||
}
|
||||
}
|
||||
|
||||
void UI::init(TexturePack& textures) {
|
||||
if($world.has_the<Background>()) {
|
||||
|
|
15
guecs.hpp
15
guecs.hpp
|
@ -126,6 +126,7 @@ namespace guecs {
|
|||
class UI {
|
||||
public:
|
||||
DinkyECS::World $world;
|
||||
std::unordered_map<std::string, DinkyECS::Entity> $name_ents;
|
||||
shared_ptr<sf::Font> $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 <typename Comp>
|
||||
void set(DinkyECS::Entity ent, Comp val) {
|
||||
$world.set<Comp>(ent, val);
|
||||
}
|
||||
|
||||
lel::Cell& cell_for(DinkyECS::Entity entity) {
|
||||
return $world.get<lel::Cell>(entity);
|
||||
}
|
||||
|
||||
template <typename Comp>
|
||||
void remove(DinkyECS::Entity ent) {
|
||||
$world.remove<Comp>(ent);
|
||||
}
|
||||
};
|
||||
|
||||
Clickable make_action(DinkyECS::World& target, Events::GUI event);
|
||||
|
|
9
gui.cpp
9
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<Player>();
|
||||
auto player_combat = $level.world->get<Combat>(player.entity);
|
||||
|
||||
if(float(player_combat.hp) / float(player_combat.max_hp) < 0.5) {
|
||||
$overlay_view.set<guecs::Sprite>("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() {
|
||||
|
|
|
@ -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<lel::Cell>(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<guecs::Sprite>(middle, blood);
|
||||
} else {
|
||||
$gui.remove<guecs::Sprite>(middle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -9,19 +9,13 @@ namespace gui {
|
|||
public:
|
||||
guecs::UI $gui;
|
||||
GameLevel $level;
|
||||
std::unordered_map<std::string, DinkyECS::Entity> $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 <typename Comp>
|
||||
// this should be in the GUECS really
|
||||
void set(std::string name, Comp val) {
|
||||
auto ent = $name_ents.at(name);
|
||||
$level.world->set<Comp>(ent, val);
|
||||
}
|
||||
void show_damage(bool show);
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue