11#include < game.hpp>
22#include < glm/gtx/norm.hpp>
33#include < le2d/context.hpp>
4- #include < cmath>
4+ #include < cstddef>
5+ #include < vector>
6+ #include " enemy.hpp"
7+ #include " enemy_params.hpp"
8+ #include " kvf/time.hpp"
9+ #include " lighhouse.hpp"
10+ #include " util/random.hpp"
511
612namespace miracle {
7- Game::Game (gsl::not_null<le::ServiceLocator const *> services) : m_services(services) {
8- m_triangle.vertices = {
9- le::Vertex{.position = {-50 .0f , -50 .0f }},
10- le::Vertex{.position = {+50 .0f , -50 .0f }},
11- le::Vertex{.position = {+0 .0f , +75 .0f }},
12- };
13- m_circle.create (50 .0f );
13+ Game::Game (gsl::not_null<le::ServiceLocator const *> services) : m_services(services), m_lighthouse(services) {
14+ m_circle.create (70 .0f );
15+ spawn_wave ();
1416}
1517
1618void Game::on_cursor_pos (le::event::CursorPos const & cursor_pos) {
@@ -19,21 +21,36 @@ void Game::on_cursor_pos(le::event::CursorPos const& cursor_pos) {
1921}
2022
2123void Game::tick ([[maybe_unused]] kvf::Seconds const dt) {
22- m_circle.transform .position = m_cursor_pos;
23-
24- auto const dist_sq = glm::length2 (m_cursor_pos);
25- if (dist_sq > 0 .1f ) {
26- auto const dist = std::sqrt (dist_sq);
27- auto const normalized = m_cursor_pos / dist;
28- static constexpr auto up_v = glm::vec2{0 .0f , 1 .0f };
29- auto const dot = glm::dot (normalized, up_v);
30- auto const angle = glm::degrees (std::acos (dot));
31- m_triangle.transform .orientation = m_cursor_pos.x > 0 .0f ? -angle : angle;
24+ if (!m_running) { return ; }
25+ m_time_since_last_wave_spawn += dt;
26+ if (m_time_since_last_wave_spawn >= m_wave_interval) {
27+ spawn_wave ();
28+ m_time_since_last_wave_spawn = kvf::Seconds{};
3229 }
30+ for (auto & enemy : m_enemies) {
31+ enemy.check_collision (m_circle.transform .position , 50 .0f );
32+ enemy.translate (dt);
33+ }
34+ std::erase_if (m_enemies, [](Enemy const & enemy) { return !enemy.get_health (); });
35+ m_circle.transform .position = m_cursor_pos;
36+ m_lighthouse.rotate_towards_cursor (m_cursor_pos);
3337}
3438
3539void Game::render (le::Renderer& renderer) const {
36- m_triangle.draw (renderer);
3740 m_circle.draw (renderer);
41+ m_lighthouse.render (renderer);
42+ for (auto const & enemy : m_enemies) { enemy.render (renderer); }
43+ }
44+
45+ void Game::spawn_wave () {
46+ ++m_wave_count;
47+ m_wave_interval += kvf::Seconds{5 };
48+ std::vector<Enemy> new_wave;
49+ std::size_t const wave_size = m_wave_count * 3 ;
50+ new_wave.reserve (wave_size);
51+ for (std::size_t i = 0 ; i < wave_size; ++i) {
52+ new_wave.emplace_back (m_services, EnemyParams{.target_pos = glm::vec2{0 .0f , 0 .0f }, .move_speed = util::random_range (35 .0f , 65 .0f )});
53+ }
54+ m_enemies.insert (m_enemies.end (), std::make_move_iterator (new_wave.begin ()), std::make_move_iterator (new_wave.end ()));
3855}
3956} // namespace miracle
0 commit comments