summaryrefslogtreecommitdiff
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
parente91ce36233474222e39ac2732100963fcb55574a (diff)
Add tracers.
-rw-r--r--Makefile1
-rw-r--r--src/common.hpp8
-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
-rw-r--r--src/render.cpp2
7 files changed, 85 insertions, 6 deletions
diff --git a/Makefile b/Makefile
index 28b2a67..6b36dd3 100644
--- a/Makefile
+++ b/Makefile
@@ -10,6 +10,7 @@ PP_LD := $(PP_BOLD)$(shell tput setf 2)LD$(PP_RESET)
PP_RM := $(PP_BOLD)$(shell tput setf 4)RM$(PP_RESET)
SRC := src/game/assets.cpp \
+ src/game/effects.cpp \
src/game/game.cpp \
src/game/interface.cpp \
src/game/units.cpp \
diff --git a/src/common.hpp b/src/common.hpp
index 6ce6c11..c946b80 100644
--- a/src/common.hpp
+++ b/src/common.hpp
@@ -186,6 +186,7 @@ namespace game {
bool load_assets(void);
class unit_t;
+ class effect_t;
class roll_params_t {
public:
@@ -202,8 +203,9 @@ namespace game {
std::unordered_set<unit_t*> selected_units;
std::unordered_set<unit_t*> awake_units;
- procgen::prng_t dice_prng;
+ std::unordered_set<effect_t*> effects;
+ procgen::prng_t dice_prng;
public:
world::world_t world;
interface::state_t *interface;
@@ -218,6 +220,8 @@ namespace game {
void command(v2f_t x);
size_t roll(roll_params_t *P);
+
+ void add_effect(effect_t *effect);
};
}
@@ -320,7 +324,7 @@ namespace render {
void render_text(v2f_t x, float height, std::string str, text_align_t align, sf::Color color);
void render_rect(rectf_t rect, sf::Color color);
void render_hlrect(rectf_t rect, sf::Color color);
- void render_arrow(v2f_t x0, v2f_t x1, sf::Color color);
+ void render_line(v2f_t x0, v2f_t x1, sf::Color color);
void debug_path(std::list<v2f_t> *path);
};
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);
}
}
diff --git a/src/render.cpp b/src/render.cpp
index d852b24..a7c6ba6 100644
--- a/src/render.cpp
+++ b/src/render.cpp
@@ -234,7 +234,7 @@ void state_t::render_hlrect(rectf_t rect, sf::Color color)
wot_rect.setOutlineColor(sf::Color::Transparent);
}
-void state_t::render_arrow(v2f_t x0, v2f_t x1, sf::Color color)
+void state_t::render_line(v2f_t x0, v2f_t x1, sf::Color color)
{
sf::Vertex line[2] = {
sf::Vertex(x0, color),