I have the overlay display the low health blood using the gui system.

master
Zed A. Shaw 2 weeks ago
parent 70a9420c11
commit d8e1fc7aa3
  1. 14
      guecs.cpp
  2. 15
      guecs.hpp
  3. 9
      gui.cpp
  4. 22
      overlay_ui.cpp
  5. 14
      overlay_ui.hpp

@ -15,9 +15,17 @@ namespace guecs {
}
DinkyECS::Entity UI::entity(std::string name) {
auto entity = $world.entity();
$world.set<CellName>(entity, {name});
return entity;
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) {

@ -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);

@ -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…
Cancel
Save