]> git.tdb.fi Git - libs/game.git/blobdiff - examples/bassteroids/source/gamecontroller.cpp
Make asteroids take damage when shot and eventually be destroyed
[libs/game.git] / examples / bassteroids / source / gamecontroller.cpp
index eae5e2d3cf27e8560c187c38cb227cd773f24d2c..97701e379fa603d9bc6ad265351bc0ffa48f845f 100644 (file)
@@ -8,7 +8,8 @@ using namespace Msp;
 
 GameController::GameController(Game::Stage &s):
        System(s),
-       asteroid_setup{ .physical={ .body={ .mass=200 }, .collider={ .type=ColliderType::CIRCLE, .radius=3.0f } },
+       asteroid_setup{ .physical={ .body={ .mass=200, .moment_of_inertia=2160 }, .collider={ .type=ColliderType::CIRCLE, .radius=3.0f } },
+               .hittable={ .damaging=true, .hits={ .max_hits=3, .vulnerable_to=1 }, .damage={ .amount=10, .type=1 }},
                .mesh={ .object_name="Asteroid 1.object" }}
 { }
 
@@ -19,11 +20,14 @@ void GameController::tick(Time::TimeDelta)
        case LEVEL_START:
                defer([this]{
                        uniform_real_distribution<float> sdist(-1, 1);
+                       uniform_real_distribution<float> udist(0, 1);
                        for(unsigned i=0; i<level+2; ++i)
                        {
                                asteroids.emplace_back(stage.get_root(), asteroid_setup);
                                asteroids.back()->get_transform()->set_position({ sdist(rng)*32, sdist(rng)*18, 0.0f });
-                               asteroids.back()->get_body()->set_velocity(asteroids.back()->get_transform()->get_position().slice<2>(0)*-0.1f);
+                               Geometry::Angle<float> angle = Geometry::Angle<float>::from_turns(udist(rng));
+                               float speed = udist(rng)*7;
+                               asteroids.back()->get_body()->set_velocity({ cos(angle)*speed, sin(angle)*speed });
                        }
                        state = PLAYING;
                });
@@ -34,3 +38,9 @@ void GameController::tick(Time::TimeDelta)
                throw logic_error("Unimplemented state");
        }
 }
+
+void GameController::deferred_tick()
+{
+       System::deferred_tick();
+       erase_if(asteroids, [](Game::Handle<Asteroid> a){ return !a->get_hitpoints()->is_alive(); });
+}