clamp input vector, allowing slow motion while holding space
In typical games we would normalize the input vector so that diagonal movement is as fast as forward or sideways movement. But here, we merely clamp each direction to an absolute maximum of 1, since every thruster can be used separately. If the forward thrusters and the leftward thrusters are active at the same time, then of course the total diagonal acceleration is faster than the forward acceleration alone.
This commit is contained in:
parent
8f682ee5b6
commit
dd49906cce
|
@ -101,10 +101,16 @@ fn run_camera_controller(
|
||||||
if key_input.pressed(settings.key_stop) {
|
if key_input.pressed(settings.key_stop) {
|
||||||
let stop_direction = -actor.v.normalize();
|
let stop_direction = -actor.v.normalize();
|
||||||
if stop_direction.length_squared() > 0.3 {
|
if stop_direction.length_squared() > 0.3 {
|
||||||
axis_input += 0.7 * (transform.rotation.inverse() * stop_direction);
|
axis_input += 0.8 * (transform.rotation.inverse() * stop_direction);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// In typical games we would normalize the input vector so that diagonal movement is as
|
||||||
|
// fast as forward or sideways movement. But here, we merely clamp each direction to an
|
||||||
|
// absolute maximum of 1, since every thruster can be used separately. If the forward
|
||||||
|
// thrusters and the leftward thrusters are active at the same time, then of course the
|
||||||
|
// total diagonal acceleration is faster than the forward acceleration alone.
|
||||||
|
axis_input = axis_input.clamp(Vec3::splat(-1.0), Vec3::splat(1.0));
|
||||||
|
|
||||||
let mut engine = if let Ok(engine) = q_engine.get_single_mut() { engine } else { player_engine };
|
let mut engine = if let Ok(engine) = q_engine.get_single_mut() { engine } else { player_engine };
|
||||||
|
|
||||||
|
@ -119,7 +125,7 @@ fn run_camera_controller(
|
||||||
let factor = Vec3::new(right_factor, up_factor, forward_factor);
|
let factor = Vec3::new(right_factor, up_factor, forward_factor);
|
||||||
|
|
||||||
if axis_input.length_squared() > 0.003 {
|
if axis_input.length_squared() > 0.003 {
|
||||||
let acceleration_global = transform.rotation * (axis_input.normalize() * factor);
|
let acceleration_global = transform.rotation * (axis_input * factor);
|
||||||
actor.v += actor::ENGINE_SPEED_FACTOR * dt * acceleration_global;
|
actor.v += actor::ENGINE_SPEED_FACTOR * dt * acceleration_global;
|
||||||
|
|
||||||
engine.current_warmup = (engine.current_warmup + dt / engine.warmup_seconds).clamp(0.0, 1.0);
|
engine.current_warmup = (engine.current_warmup + dt / engine.warmup_seconds).clamp(0.0, 1.0);
|
||||||
|
|
Loading…
Reference in a new issue