]> git.tdb.fi Git - libs/game.git/blob - examples/bassteroids/source/gamecontroller.cpp
97701e379fa603d9bc6ad265351bc0ffa48f845f
[libs/game.git] / examples / bassteroids / source / gamecontroller.cpp
1 #include "gamecontroller.h"
2 #include <stdexcept>
3 #include <msp/game/root.h>
4 #include <msp/game/transform.h>
5
6 using namespace std;
7 using namespace Msp;
8
9 GameController::GameController(Game::Stage &s):
10         System(s),
11         asteroid_setup{ .physical={ .body={ .mass=200, .moment_of_inertia=2160 }, .collider={ .type=ColliderType::CIRCLE, .radius=3.0f } },
12                 .hittable={ .damaging=true, .hits={ .max_hits=3, .vulnerable_to=1 }, .damage={ .amount=10, .type=1 }},
13                 .mesh={ .object_name="Asteroid 1.object" }}
14 { }
15
16 void GameController::tick(Time::TimeDelta)
17 {
18         switch(state)
19         {
20         case LEVEL_START:
21                 defer([this]{
22                         uniform_real_distribution<float> sdist(-1, 1);
23                         uniform_real_distribution<float> udist(0, 1);
24                         for(unsigned i=0; i<level+2; ++i)
25                         {
26                                 asteroids.emplace_back(stage.get_root(), asteroid_setup);
27                                 asteroids.back()->get_transform()->set_position({ sdist(rng)*32, sdist(rng)*18, 0.0f });
28                                 Geometry::Angle<float> angle = Geometry::Angle<float>::from_turns(udist(rng));
29                                 float speed = udist(rng)*7;
30                                 asteroids.back()->get_body()->set_velocity({ cos(angle)*speed, sin(angle)*speed });
31                         }
32                         state = PLAYING;
33                 });
34                 break;
35         case PLAYING:
36                 break;
37         default:
38                 throw logic_error("Unimplemented state");
39         }
40 }
41
42 void GameController::deferred_tick()
43 {
44         System::deferred_tick();
45         erase_if(asteroids, [](Game::Handle<Asteroid> a){ return !a->get_hitpoints()->is_alive(); });
46 }