X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=examples%2Fbassteroids%2Fsource%2Fplayercontroller.cpp;h=54f7520a1a4f7bf93a1056addfa20c6df1f51fa8;hb=41a17ae9a2baa2cafacfc467acc87463d790c09b;hp=939d8384c200fb3dd0c7f4077e1b0b6b8b775b0a;hpb=cc481ab063def07fd41e4681891dae109945a163;p=libs%2Fgame.git diff --git a/examples/bassteroids/source/playercontroller.cpp b/examples/bassteroids/source/playercontroller.cpp index 939d838..54f7520 100644 --- a/examples/bassteroids/source/playercontroller.cpp +++ b/examples/bassteroids/source/playercontroller.cpp @@ -8,10 +8,12 @@ using namespace Msp; PlayerController::PlayerController(Game::Stage &s): System(s), - player_setup{ .physical={ .body={ .mass=1 }, .collider={ .type=ColliderType::CIRCLE, .radius=0.8f }}, - .mesh={ .object_name="Bass guitar.object" }, - .speed=12.0f, .turn_rate=4.71f } -{ } + player_setup(stage.get_resources().get("player.ship.setup")), + bullet_setup(stage.get_resources().get("quaver.bullet.setup")) +{ + declare_dependency(READ_OLD); + declare_dependency(UPDATE); +} void PlayerController::set_controls(Controls *c) { @@ -38,10 +40,37 @@ void PlayerController::tick(Time::TimeDelta dt) body->add_force(fwd_dir*(controls->forward.get_value()*thrust)); const LinAl::Vector &velocity = body->get_velocity(); float speed = velocity.norm(); - body->add_force(velocity*-min(speed+setup.speed/speed, 1.0f/dt_secs)); + if(speed>1e-5) + body->add_force(velocity*-min(speed+setup.speed/speed, 1.0f/dt_secs)); body->add_torque(controls->turn_left.get_value()*torque); Geometry::Angle angular_vel = body->get_angular_velocity(); Geometry::Angle angular_speed = abs(angular_vel); - body->add_torque(angular_vel.radians()*-min(angular_speed.radians()+setup.turn_rate/angular_speed.radians(), 1.0f/dt_secs)); + if(abs(angular_speed.radians())>1e-5) + body->add_torque(angular_vel.radians()*-min(angular_speed.radians()+setup.turn_rate/angular_speed.radians(), 1.0f/dt_secs)); + + if(controls->fire.was_pressed()) + defer([this]{ fire(); }); + + controls->reset_edges(); +} + +void PlayerController::deferred_tick() +{ + System::deferred_tick(); + erase_if(bullets, [](Game::Handle b){ return !b->get_hitpoints()->is_alive(); }); +} + +void PlayerController::fire() +{ + Game::Handle player_tf = player_ship->get_transform(); + Game::Handle player_body = player_ship->get_body(); + + Game::TransformValues tv; + tv.position = (player_tf->get_world_matrix()*LinAl::Vector(2.0f, 0.0f, 0.0f, 1.0f)).slice<3>(0); + tv.rotation = player_tf->get_rotation()*Geometry::Quaternion::rotation(Geometry::Angle::from_degrees(10), LinAl::Vector(0.0f, 0.0f, 1.0f)); + bullets.emplace_back(stage.get_root(), bullet_setup, tv); + Game::Handle bullet = bullets.back(); + Game::Handle bullet_body = bullet->get_body(); + bullet_body->set_velocity(player_body->get_velocity()+(player_tf->get_world_matrix()*LinAl::Vector(20.0f, 0.0f, 0.0f, 0.0f)).slice<2>(0)); }