summaryrefslogtreecommitdiff
path: root/src/game
diff options
context:
space:
mode:
authorPaweł Redman <pawel.redman@gmail.com>2017-12-15 15:01:38 +0100
committerPaweł Redman <pawel.redman@gmail.com>2017-12-15 15:01:38 +0100
commitcd9b7052f07291e3975bad5dcfe9ad0338c17e74 (patch)
tree532e33fe82f6335ae63c51e461c1814363c711a6 /src/game
parente91ce36233474222e39ac2732100963fcb55574a (diff)
Add tracers.
Diffstat (limited to 'src/game')
-rw-r--r--src/game/effects.cpp37
-rw-r--r--src/game/game.cpp15
-rw-r--r--src/game/game.hpp23
-rw-r--r--src/game/units.cpp5
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);
}
}