2
2
#include < glm/gtx/norm.hpp>
3
3
#include < le2d/context.hpp>
4
4
#include < cstddef>
5
+ #include < string>
5
6
#include < vector>
6
7
#include " enemy.hpp"
7
8
#include " enemy_params.hpp"
8
9
#include " kvf/time.hpp"
10
+ #include " le2d/asset_loader.hpp"
11
+ #include " le2d/data_loader.hpp"
12
+ #include " le2d/drawable/text.hpp"
9
13
#include " lighhouse.hpp"
10
14
#include " util/random.hpp"
11
15
12
16
namespace miracle {
13
- Game::Game (gsl::not_null<le::ServiceLocator const *> services) : m_services(services), m_lighthouse(services), m_light(services) { spawn_wave (); }
17
+ Game::Game (gsl::not_null<le::ServiceLocator const *> services)
18
+ : m_services(services), m_lighthouse(services), m_light(services), m_score_text(le::drawable::Text()) {
19
+ spawn_wave ();
20
+ auto const & data_loader = services->get <le::IDataLoader>();
21
+ auto const & context = services->get <le::Context>();
22
+ auto const asset_loader = le::AssetLoader{&data_loader, &context};
23
+ m_font = asset_loader.load_font (" fonts/specialElite.ttf" );
24
+ auto const framebuffer_size = m_services->get <le::Context>().framebuffer_size ();
25
+
26
+ m_score_text.transform .position .y = static_cast <float >(framebuffer_size.y ) / 2 .0f - 50 .0f ;
27
+ }
14
28
15
29
void Game::on_cursor_pos (le::event::CursorPos const & cursor_pos) {
16
30
auto const framebuffer_size = m_services->get <le::Context>().framebuffer_size ();
@@ -25,10 +39,12 @@ void Game::tick([[maybe_unused]] kvf::Seconds const dt) {
25
39
m_time_since_last_wave_spawn = kvf::Seconds{};
26
40
}
27
41
for (auto & enemy : m_enemies) {
28
- m_light.check_enemy_collision (enemy);
42
+ m_light.check_enemy_collision (enemy);
29
43
enemy.translate (dt);
30
44
}
31
- std::erase_if (m_enemies, [](Enemy const & enemy) { return !enemy.get_health (); });
45
+ // Keep track of how many enemies were defeated and calculate score
46
+ auto res = std::erase_if (m_enemies, [](Enemy const & enemy) { return !enemy.get_health (); });
47
+ increase_score (res * 10 );
32
48
m_light.set_position (m_cursor_pos);
33
49
m_lighthouse.rotate_towards_cursor (m_cursor_pos);
34
50
}
@@ -37,6 +53,7 @@ void Game::render(le::Renderer& renderer) const {
37
53
m_light.render (renderer);
38
54
m_lighthouse.render (renderer);
39
55
for (auto const & enemy : m_enemies) { enemy.render (renderer); }
56
+ m_score_text.draw (renderer);
40
57
}
41
58
42
59
void Game::spawn_wave () {
@@ -50,4 +67,9 @@ void Game::spawn_wave() {
50
67
}
51
68
m_enemies.insert (m_enemies.end (), std::make_move_iterator (new_wave.begin ()), std::make_move_iterator (new_wave.end ()));
52
69
}
70
+
71
+ void Game::increase_score (std::size_t points) {
72
+ m_score += points;
73
+ m_score_text.set_string (m_font, " Score: " + std::to_string (m_score));
74
+ }
53
75
} // namespace miracle
0 commit comments