GameController::GameController(Game::Stage &s):
System(s),
- asteroid_setup{ .physical = { .body = { .mass = 200 }, .collider = { .type = ColliderType::CIRCLE, .radius = 3.0f } },
- .mesh = { .object_name = "Asteroid 1.object" }}
+ 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" }}
{ }
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;
});
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(); });
+}