66#include < vector>
77#include " enemy.hpp"
88#include " enemy_params.hpp"
9+ #include " glm/ext/vector_float2.hpp"
910#include " kvf/time.hpp"
1011#include " le2d/asset_loader.hpp"
1112#include " le2d/data_loader.hpp"
@@ -22,8 +23,9 @@ Game::Game(gsl::not_null<le::ServiceLocator const*> services)
2223 auto const asset_loader = le::AssetLoader{&data_loader, &context};
2324 m_font = asset_loader.load_font (" fonts/specialElite.ttf" );
2425 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 ;
26+ auto const y = (static_cast <float >(framebuffer_size.y ) / 2 .0f ) - 50 .0f ;
27+ m_score_text.transform .position .y = y;
28+ m_health_text.transform .position = glm::vec2{(static_cast <float >(framebuffer_size.y ) / 2 .0f ) - 50 .0f , y};
2729}
2830
2931void Game::on_cursor_pos (le::event::CursorPos const & cursor_pos) {
@@ -32,19 +34,24 @@ void Game::on_cursor_pos(le::event::CursorPos const& cursor_pos) {
3234}
3335
3436void Game::tick ([[maybe_unused]] kvf::Seconds const dt) {
37+ m_running = m_lighthouse.get_health () > 0 ;
3538 if (!m_running) { return ; }
39+
3640 m_time_since_last_wave_spawn += dt;
3741 if (m_time_since_last_wave_spawn >= m_wave_interval) {
3842 spawn_wave ();
3943 m_time_since_last_wave_spawn = kvf::Seconds{};
4044 }
4145 for (auto & enemy : m_enemies) {
4246 m_light.check_enemy_collision (enemy);
47+ m_lighthouse.check_visibility_range (enemy);
48+ set_health_text ();
4349 enemy.translate (dt);
4450 }
4551 // Keep track of how many enemies were defeated and calculate score
4652 auto res = std::erase_if (m_enemies, [](Enemy const & enemy) { return !enemy.get_health (); });
4753 increase_score (res * 10 );
54+
4855 m_light.set_position (m_cursor_pos);
4956 m_lighthouse.rotate_towards_cursor (m_cursor_pos);
5057}
@@ -54,6 +61,7 @@ void Game::render(le::Renderer& renderer) const {
5461 m_lighthouse.render (renderer);
5562 for (auto const & enemy : m_enemies) { enemy.render (renderer); }
5663 m_score_text.draw (renderer);
64+ m_health_text.draw (renderer);
5765}
5866
5967void Game::spawn_wave () {
@@ -72,4 +80,11 @@ void Game::increase_score(std::size_t points) {
7280 m_score += points;
7381 m_score_text.set_string (m_font, " Score: " + std::to_string (m_score));
7482}
83+
84+ void Game::set_health_text () {
85+ float const health = m_lighthouse.get_health ();
86+ std::string text = health > 0 ? " Health: " + std::format (" {:.1f}" , health) : " Game Over" ;
87+ m_health_text.set_string (m_font, text);
88+ }
89+
7590} // namespace miracle
0 commit comments