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

master
Zed A. Shaw 3 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) { DinkyECS::Entity UI::entity(std::string name) {
auto entity = $world.entity(); if($name_ents.contains(name)) {
$world.set<CellName>(entity, {name}); // already exists so just return it
return entity; 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) { void UI::init(TexturePack& textures) {

@ -126,6 +126,7 @@ namespace guecs {
class UI { class UI {
public: public:
DinkyECS::World $world; DinkyECS::World $world;
std::unordered_map<std::string, DinkyECS::Entity> $name_ents;
shared_ptr<sf::Font> $font = nullptr; shared_ptr<sf::Font> $font = nullptr;
lel::Parser $parser; lel::Parser $parser;
std::string $grid = ""; std::string $grid = "";
@ -147,6 +148,20 @@ namespace guecs {
void init(TexturePack& textures); void init(TexturePack& textures);
void render(sf::RenderWindow& window); void render(sf::RenderWindow& window);
void mouse(float x, float y); 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); Clickable make_action(DinkyECS::World& target, Events::GUI event);

@ -18,7 +18,7 @@ namespace gui {
$map_view($level), $map_view($level),
$combat_view($level), $combat_view($level),
$status_view($level), $status_view($level),
$overlay_view($level), $overlay_view($level, $textures),
$font{FONT_FILE_NAME}, $font{FONT_FILE_NAME},
$text{$font}, $text{$font},
$rayview($textures, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT) $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); $rayview.position_camera($player.x + 0.5, $player.y + 0.5);
$combat_view.render($textures); $combat_view.render($textures);
$overlay_view.render($textures); $overlay_view.render();
$status_view.render($textures); $status_view.render($textures);
$status_view.log("Welcome to the game!"); $status_view.log("Welcome to the game!");
@ -301,10 +301,7 @@ namespace gui {
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.set<guecs::Sprite>("middle", {"blood_splatter"});
$overlay_view.$gui.init($textures);
}
} }
void FSM::draw_gui() { void FSM::draw_gui() {

@ -6,8 +6,9 @@
namespace gui { namespace gui {
using namespace guecs; using namespace guecs;
OverlayUI::OverlayUI(GameLevel level) : OverlayUI::OverlayUI(GameLevel level, TexturePack& textures) :
$level(level) $level(level),
$textures(textures)
{ {
$gui.position(RAY_VIEW_X, RAY_VIEW_Y, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT); $gui.position(RAY_VIEW_X, RAY_VIEW_Y, RAY_VIEW_WIDTH, RAY_VIEW_HEIGHT);
$gui.layout( $gui.layout(
@ -19,18 +20,29 @@ namespace gui {
); );
} }
void OverlayUI::render(TexturePack &textures) { void OverlayUI::render() {
auto &world = $gui.world(); auto &world = $gui.world();
for(auto &[name, cell] : $gui.cells()) { for(auto &[name, cell] : $gui.cells()) {
auto region = $gui.entity(name); auto region = $gui.entity(name);
$name_ents.insert_or_assign(name, region);
world.set<lel::Cell>(region, cell); world.set<lel::Cell>(region, cell);
} }
$gui.init(textures); $gui.init($textures);
} }
void OverlayUI::draw(sf::RenderWindow& window) { void OverlayUI::draw(sf::RenderWindow& window) {
$gui.render(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: public:
guecs::UI $gui; guecs::UI $gui;
GameLevel $level; 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 draw(sf::RenderWindow& window);
void click(int x, int y); void click(int x, int y);
void show_damage(bool show);
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);
}
}; };
} }

Loading…
Cancel
Save