X-Git-Url: https://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fui%2Fui.cpp;h=cedbcd127be0273798ab294b699c2cd40d128403;hb=e59f3058d8786dc0a053c42bcec8f01b22ec25a9;hp=31f0396a9072c2f3fc6e438f90f45bd801ea1026;hpb=56f570e713c42d30109a214e68a2beed96ba1999;p=blobs.git diff --git a/src/ui/ui.cpp b/src/ui/ui.cpp index 31f0396..cedbcd1 100644 --- a/src/ui/ui.cpp +++ b/src/ui/ui.cpp @@ -1,7 +1,10 @@ #include "CreaturePanel.hpp" +#include "Label.hpp" +#include "Meter.hpp" #include "../app/Assets.hpp" #include "../creature/Creature.hpp" +#include "../creature/Need.hpp" #include "../graphics/Viewport.hpp" #include @@ -11,16 +14,34 @@ namespace blobs { namespace ui { CreaturePanel::CreaturePanel(const app::Assets &assets) -: c(nullptr) +: assets(assets) +, c(nullptr) , name(new Label(assets.fonts.large)) -, panel() { +, needs(new Panel) +, panel() +, health_meter(new Meter) +, need_meters() { + Label *health_label = new Label(assets.fonts.medium); + health_label->Text("Health"); + health_meter + ->Size(glm::vec2(100.0f, assets.fonts.medium.Height() + assets.fonts.medium.Descent())) + ->Padding(glm::vec2(1.0f)) + ->Border(1.0f) + ->FillColor(glm::vec4(0.9f, 0.0f, 0.0f, 1.0f)) + ->BorderColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)); + Panel *health_panel = new Panel; + health_panel + ->Add(health_label) + ->Add(health_meter) + ->Direction(Panel::HORIZONTAL); panel .Add(name) - .Padding(glm::vec2(10.0f)) - .Spacing(10.0f) - .Direction(Panel::VERTICAL) - .Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f)) - .Origin(Gravity::NORTH_EAST); + ->Add(health_panel) + ->Add(needs) + ->Padding(glm::vec2(10.0f)) + ->Spacing(10.0f) + ->Direction(Panel::VERTICAL) + ->Background(glm::vec4(0.7f, 0.7f, 0.7f, 1.0f)); } CreaturePanel::~CreaturePanel() { @@ -30,6 +51,33 @@ CreaturePanel::~CreaturePanel() { void CreaturePanel::Show(creature::Creature &cr) { c = &cr; name->Text(c->Name()); + CreateNeeds(); +} + +void CreaturePanel::CreateNeeds() { + needs->Clear()->Reserve(c->Needs().size()); + need_meters.clear(); + need_meters.reserve(c->Needs().size()); + for (auto &need : c->Needs()) { + Label *label = new Label(assets.fonts.medium); + label->Text(need->name); + Meter *meter = new Meter; + meter + ->Value(1.0f - need->value) + ->Size(glm::vec2(100.0f, assets.fonts.medium.Height() + assets.fonts.medium.Descent())) + ->Padding(glm::vec2(1.0f)) + ->Border(1.0f) + ->FillColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)) + ->BorderColor(glm::vec4(0.0f, 0.0f, 0.0f, 1.0f)); + Panel *need_panel = new Panel; + need_panel + ->Direction(Panel::HORIZONTAL) + ->Spacing(10.0f) + ->Add(label) + ->Add(meter); + needs->Add(need_panel); + need_meters.push_back(meter); + } panel.Relayout(); } @@ -40,9 +88,29 @@ void CreaturePanel::Hide() noexcept { void CreaturePanel::Draw(app::Assets &assets, graphics::Viewport &viewport) noexcept { if (!c) return; + health_meter->Value(c->Health()); + + if (need_meters.size() != c->Needs().size()) { + CreateNeeds(); + } else { + auto need = c->Needs().begin(); + auto need_end = c->Needs().end(); + auto meter = need_meters.begin(); + for (; need != need_end; ++need, ++meter) { + (*meter)->Value(1.0f - (*need)->value); + if ((*need)->IsSatisfied()) { + (*meter)->FillColor(glm::vec4(0.0f, 0.7f, 0.0f, 1.0f)); + } else if ((*need)->IsInconvenient()) { + (*meter)->FillColor(glm::vec4(0.7f, 0.5f, 0.0f, 1.0f)); + } else { + (*meter)->FillColor(glm::vec4(0.9f, 0.0f, 0.0f, 1.0f)); + } + } + } + const glm::vec2 margin(20.0f); - panel.Position(glm::vec3(viewport.Width() - margin.x, margin.y, 0.0f)); + panel.Position(glm::vec2(viewport.Width() - margin.x - panel.Size().x, margin.y)); panel.Draw(assets, viewport); }