]> git.tdb.fi Git - libs/game.git/blobdiff - examples/bassteroids/source/playercontroller.cpp
Make it possible to shoot bullets in Bassteroids
[libs/game.git] / examples / bassteroids / source / playercontroller.cpp
index 606f34ea69ea7eb4fe70478f9c6880d8eb0d12c7..65a879d2447727277ce4da16c4b4e1f822f57aef 100644 (file)
@@ -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)
@@ -38,10 +40,31 @@ void PlayerController::tick(Time::TimeDelta dt)
        body->add_force(fwd_dir*(controls->forward.get_value()*thrust));
        const LinAl::Vector<float, 2> &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<float> angular_vel = body->get_angular_velocity();
        Geometry::Angle<float> 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())
+               fire();
+
+       controls->reset_edges();
+}
+
+void PlayerController::fire()
+{
+       Game::Handle<Game::Transform> player_tf = player_ship->get_transform();
+       Game::Handle<RigidBody> player_body = player_ship->get_body();
+
+       bullets.emplace_back(stage.get_root(), bullet_setup);
+       Game::Handle<Bullet> bullet = bullets.back();
+       Game::Handle<Game::Transform> bullet_tf = bullet->get_transform();
+       bullet_tf->set_position((player_tf->get_world_matrix()*LinAl::Vector<float, 4>(2.0f, 0.0f, 0.0f, 1.0f)).slice<3>(0));
+       bullet_tf->set_rotation(player_tf->get_rotation()*Geometry::Quaternion<float>::rotation(Geometry::Angle<float>::from_degrees(10), LinAl::Vector<float, 3>(0.0f, 0.0f, 1.0f)));
+       Game::Handle<RigidBody> bullet_body = bullet->get_body();
+       bullet_body->set_velocity(player_body->get_velocity()+(player_tf->get_world_matrix()*LinAl::Vector<float, 4>(20.0f, 0.0f, 0.0f, 0.0f)).slice<2>(0));
 }