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
14
guecs.cpp
14
guecs.cpp
|
@ -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) {
|
||||||
|
|
15
guecs.hpp
15
guecs.hpp
|
@ -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);
|
||||||
|
|
9
gui.cpp
9
gui.cpp
|
@ -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…
Add table
Add a link
Reference in a new issue