X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=examples%2Fbassteroids%2Fsource%2Fplayercontroller.cpp;h=65a879d2447727277ce4da16c4b4e1f822f57aef;hb=683858c0265e820d57bb5a1f7f21ab72b232a79d;hp=cd7e72ad3a53f191a36b23921466d1834dbd985f;hpb=c193dd08af5159544008b5fee0813b1f716ac062;p=libs%2Fgame.git diff --git a/examples/bassteroids/source/playercontroller.cpp b/examples/bassteroids/source/playercontroller.cpp index cd7e72a..65a879d 100644 --- a/examples/bassteroids/source/playercontroller.cpp +++ b/examples/bassteroids/source/playercontroller.cpp @@ -10,7 +10,9 @@ PlayerController::PlayerController(Game::Stage &s): System(s), player_setup{ .physical={ .body={ .mass=1, .moment_of_inertia=0.8f }, .collider={ .type=ColliderType::CIRCLE, .radius=0.8f }}, .mesh={ .object_name="Bass guitar.object" }, - .speed=12.0f, .turn_rate=4.71f } + .speed=12.0f, .turn_rate=4.71f }, + bullet_setup{ .physical={ .body={ .mass=0.05f, .moment_of_inertia=0.04f }, .collider={ .type=ColliderType::CIRCLE, .radius=0.2f }}, + .mesh={ .object_name="Quaver.object" }} { } void PlayerController::set_controls(Controls *c) @@ -46,4 +48,23 @@ void PlayerController::tick(Time::TimeDelta dt) Geometry::Angle angular_speed = abs(angular_vel); 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()) + fire(); + + controls->reset_edges(); +} + +void PlayerController::fire() +{ + Game::Handle player_tf = player_ship->get_transform(); + Game::Handle player_body = player_ship->get_body(); + + bullets.emplace_back(stage.get_root(), bullet_setup); + Game::Handle bullet = bullets.back(); + Game::Handle bullet_tf = bullet->get_transform(); + bullet_tf->set_position((player_tf->get_world_matrix()*LinAl::Vector(2.0f, 0.0f, 0.0f, 1.0f)).slice<3>(0)); + bullet_tf->set_rotation(player_tf->get_rotation()*Geometry::Quaternion::rotation(Geometry::Angle::from_degrees(10), LinAl::Vector(0.0f, 0.0f, 1.0f))); + 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)); }