22#include < glm/gtx/norm.hpp>
33#include < le2d/context.hpp>
44#include < cstddef>
5+ #include < format>
6+ #include < iterator>
7+ #include < string>
58#include < vector>
69#include " enemy.hpp"
710#include " enemy_params.hpp"
811#include " kvf/time.hpp"
12+ #include " le2d/asset_loader.hpp"
13+ #include " le2d/data_loader.hpp"
14+ #include " le2d/drawable/text.hpp"
915#include " lighhouse.hpp"
1016#include " util/random.hpp"
1117
1218namespace miracle {
13- Game::Game (gsl::not_null<le::ServiceLocator const *> services) : m_services(services), m_lighthouse(services) {
14- m_circle.create (70 .0f );
19+ Game::Game (gsl::not_null<le::ServiceLocator const *> services) : m_services(services), m_lighthouse(services), m_light(services) {
1520 spawn_wave ();
21+ auto const & data_loader = services->get <le::IDataLoader>();
22+ auto const & context = services->get <le::Context>();
23+ auto const asset_loader = le::AssetLoader{&data_loader, &context};
24+ m_font = asset_loader.load_font (" fonts/specialElite.ttf" );
1625}
1726
1827void Game::on_cursor_pos (le::event::CursorPos const & cursor_pos) {
@@ -28,18 +37,21 @@ void Game::tick([[maybe_unused]] kvf::Seconds const dt) {
2837 m_time_since_last_wave_spawn = kvf::Seconds{};
2938 }
3039 for (auto & enemy : m_enemies) {
31- enemy. check_collision (m_circle. transform . position , 50 . 0f );
40+ m_light. check_enemy_collision (enemy );
3241 enemy.translate (dt);
3342 }
34- std::erase_if (m_enemies, [](Enemy const & enemy) { return !enemy.get_health (); });
35- m_circle.transform .position = m_cursor_pos;
43+ // Keep track of how many enemies were defeated and calculate score
44+ auto res = std::erase_if (m_enemies, [](Enemy const & enemy) { return !enemy.get_health (); });
45+ update_score (static_cast <int >(res * 10 ));
46+ m_light.set_position (m_cursor_pos);
3647 m_lighthouse.rotate_towards_cursor (m_cursor_pos);
3748}
3849
3950void Game::render (le::Renderer& renderer) const {
40- m_circle. draw (renderer);
51+ m_light. render (renderer);
4152 m_lighthouse.render (renderer);
4253 for (auto const & enemy : m_enemies) { enemy.render (renderer); }
54+ m_score_text.draw (renderer);
4355}
4456
4557void Game::spawn_wave () {
@@ -53,4 +65,13 @@ void Game::spawn_wave() {
5365 }
5466 m_enemies.insert (m_enemies.end (), std::make_move_iterator (new_wave.begin ()), std::make_move_iterator (new_wave.end ()));
5567}
68+
69+ void Game::update_score (int points) {
70+ auto const framebuffer_size = m_services->get <le::Context>().framebuffer_size ();
71+ m_score_text.transform .position .y = static_cast <float >(framebuffer_size.y ) / 2 .0f - 50 .0f ;
72+ m_score += points;
73+ m_score_str.clear ();
74+ std::format_to (std::back_inserter (m_score_str), " Score: {}" , m_score);
75+ m_score_text.set_string (m_font, m_score_str);
76+ }
5677} // namespace miracle
0 commit comments