diff options
author | Paweł Redman <pawel.redman@gmail.com> | 2017-12-15 15:01:38 +0100 |
---|---|---|
committer | Paweł Redman <pawel.redman@gmail.com> | 2017-12-15 15:01:38 +0100 |
commit | cd9b7052f07291e3975bad5dcfe9ad0338c17e74 (patch) | |
tree | 532e33fe82f6335ae63c51e461c1814363c711a6 /src/game | |
parent | e91ce36233474222e39ac2732100963fcb55574a (diff) |
Add tracers.
Diffstat (limited to 'src/game')
-rw-r--r-- | src/game/effects.cpp | 37 | ||||
-rw-r--r-- | src/game/game.cpp | 15 | ||||
-rw-r--r-- | src/game/game.hpp | 23 | ||||
-rw-r--r-- | src/game/units.cpp | 5 |
4 files changed, 77 insertions, 3 deletions
diff --git a/src/game/effects.cpp b/src/game/effects.cpp new file mode 100644 index 0000000..99c8be8 --- /dev/null +++ b/src/game/effects.cpp @@ -0,0 +1,37 @@ +#include "game.hpp" + +namespace game { + +effect_t::effect_t(state_t *game_) : world::entity_t(ET_EFFECT) +{ + game = game_; +} + +fx_tracer_t::fx_tracer_t(state_t *game_, v2f_t x0_, v2f_t x1_) : effect_t(game_) +{ + ttl = game->now + 0.07; + + x0 = x0_; + x1 = x1_; + + render_bounds[0] = x0; + render_bounds[1] = x1; + render_bounds = render_bounds.norm(); +} + +void fx_tracer_t::render_to(render::state_t *render) +{ + v2f_t x0l, x1l; + float t; + + t = 1.0f - (ttl - game->now) / 0.07f * 0.7f; + + x0l[0] = lerp(x0[0], x1[0], t); + x0l[1] = lerp(x0[1], x1[1], t); + x1l[0] = lerp(x0[0], x1[0], t + 0.3f); + x1l[1] = lerp(x0[1], x1[1], t + 0.3f); + + render->render_line(x0l, x1l, sf::Color::Yellow); +} + +} // namespace game diff --git a/src/game/game.cpp b/src/game/game.cpp index 96f76d3..1619de0 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -82,6 +82,12 @@ void state_t::command(v2f_t x) } } +void state_t::add_effect(effect_t *effect) +{ + effects.insert(effect); + effect->link(&world); +} + void state_t::tick(double now_, double dt_) { union { @@ -145,6 +151,15 @@ void state_t::tick(double now_, double dt_) i++; } } + + for (auto i = std::begin(effects); i != std::end(effects);) { + if (now > (*i)->ttl) { + (*i)->unlink(); + //delete *i; FIXME + i = effects.erase(i); + } else + i++; + } } roll_params_t::roll_params_t(size_t sides_) diff --git a/src/game/game.hpp b/src/game/game.hpp index a952576..0a1d0ca 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -2,7 +2,8 @@ namespace game { enum { - ET_UNIT + ET_UNIT, + ET_EFFECT }; enum { @@ -119,7 +120,7 @@ namespace game { v2f_t last_target_x; public: - human_t(game::state_t *game); + human_t(game::state_t *game_); void render_to(render::state_t *render); void wake(unit_t *by_whom); @@ -132,7 +133,7 @@ namespace game { double next_targetting = -INFINITY; public: - alien_t(game::state_t *game); + alien_t(game::state_t *game_); void render_to(render::state_t *render); void wake(unit_t *by_whom); @@ -140,4 +141,20 @@ namespace game { void think(void); void die(void); }; + + class effect_t : public world::entity_t { + public: + game::state_t *game; + + double ttl = +INFINITY; + effect_t(game::state_t *game_); + }; + + class fx_tracer_t : public effect_t { + v2f_t x0, x1; + + public: + fx_tracer_t(game::state_t *game_, v2f_t x0_, v2f_t x1_); + void render_to(render::state_t *render); + }; }; diff --git a/src/game/units.cpp b/src/game/units.cpp index 0f992f9..c50a3fb 100644 --- a/src/game/units.cpp +++ b/src/game/units.cpp @@ -297,8 +297,13 @@ void human_t::think(void) trace = world->trace(x, target->x, CF_SOLID); if (!trace.hit) { + fx_tracer_t *tracer; + last_attack = game->now; try_attack(target); + + tracer = new fx_tracer_t(game, x, target->x); + game->add_effect(tracer); } } |