From 5680dc7b0c93d208fab8c4c30172ab2c3b53f82b Mon Sep 17 00:00:00 2001 From: Aki Date: Sat, 19 Nov 2022 00:42:19 +0100 Subject: Split damage pop into more verbose components --- kurator/src/Battle.cpp | 38 +++++++++++++++++++++++++------------- kurator/src/DamagePop.h | 15 --------------- kurator/src/components.h | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 59 insertions(+), 28 deletions(-) delete mode 100644 kurator/src/DamagePop.h create mode 100644 kurator/src/components.h diff --git a/kurator/src/Battle.cpp b/kurator/src/Battle.cpp index ffddc92..bee8932 100644 --- a/kurator/src/Battle.cpp +++ b/kurator/src/Battle.cpp @@ -7,13 +7,14 @@ #include +#include #include #include -#include +#include #include #include -#include "DamagePop.h" +#include "components.h" #include "Session.h" #include "Title.h" @@ -41,12 +42,21 @@ Battle::update(const float dt) { battle->update(dt); auto& registry = battle->registry(); - auto pops = registry.view(); - for (auto&& [entity, pop] : pops.each()) { - pop.timer -= dt; - if (pop.timer < 0.0) + auto timers = registry.view(); + for (auto&& [entity, timer] : timers.each()) { + timer.left -= dt; + if (timer.left < 0.0) registry.destroy(entity); } + auto pops = registry.view(); + for (auto&& [entity, pop, transform] : pops.each()) { + const auto speed = pop.speed.scale(dt); + transform.position.x += speed.x; + transform.position.y += speed.y; + const auto damp = pop.speed.scale(pop.damp).scale(dt); + pop.speed.x -= damp.x; + pop.speed.y -= damp.y; + } if (IsKeyPressed(KEY_SPACE)) session->set(std::make_shared(session)); } @@ -69,12 +79,11 @@ Battle::draw() const DrawLine(x, y, x + 6 * std::cos(transform.angle), y + 6 * std::sin(transform.angle), WHITE); DrawText(ship_type.name.c_str(), x+10, y-10, 20.0f, GRAY); } - auto pops = registry.view<DamagePop, const battles::Transform>(); - for (auto [entity, pop, transform] : pops.each()) { - const int x = width/2 + transform.position.x*scale; - const int y = height/2 + transform.position.y*scale; - const int text = MeasureText(pop.text, 10); - DrawText(pop.text, x-text/2, y-5-22*(0.4-pop.timer), 10, RED); + auto pops = registry.view<CenteredText, battles::Transform>(); + for (const auto& [entity, text, transform] : pops.each()) { + const int x = width/2 + transform.position.x*scale - text.width/2; + const int y = height/2 + transform.position.y*scale - text.font_size/2; + DrawText(text.text, x, y, text.font_size, text.color); } } @@ -86,9 +95,12 @@ Battle::receive(const battles::Hit& hit) if (!registry.valid(hit.victim)) return; const auto entity = registry.create(); + const auto text = TextFormat("%.1f", hit.damage); const auto& transform = registry.get<battles::Transform>(hit.victim); - registry.emplace<DamagePop>(entity, 0.4, TextFormat("%.1f", hit.damage)); + registry.emplace<Timed>(entity, 1.2); + registry.emplace<CenteredText>(entity, text, MeasureText(text, 10), 10, RED); registry.emplace<battles::Transform>(entity, transform.position, 0.0); + registry.emplace<PopMove>(entity, battles::Point{0.0, -0.6}, 0.998); } diff --git a/kurator/src/DamagePop.h b/kurator/src/DamagePop.h deleted file mode 100644 index dc4c19a..0000000 --- a/kurator/src/DamagePop.h +++ /dev/null @@ -1,15 +0,0 @@ -#pragma once - - -namespace kurator -{ - - -struct DamagePop -{ - double timer; - const char* text; -}; - - -} // namespace kurator diff --git a/kurator/src/components.h b/kurator/src/components.h new file mode 100644 index 0000000..655db2f --- /dev/null +++ b/kurator/src/components.h @@ -0,0 +1,34 @@ +#pragma once + +#include <raylib.h> + +#include <kurator/battles/Point.h> + + +namespace kurator +{ + + +struct Timed +{ + double left; +}; + + +struct CenteredText +{ + const char* text; + int width; + int font_size; + Color color; +}; + + +struct PopMove +{ + battles::Point speed; + double damp; +}; + + +} // namespace kurator -- cgit v1.1