Smooth airship movement

This commit is contained in:
Joshua Barretto 2021-03-12 14:56:47 +00:00
parent d3ee035449
commit fcaf2b50d1
3 changed files with 13 additions and 10 deletions

View File

@ -164,15 +164,16 @@ impl Body {
quadruped_low::Species::Lavadrake => 4.0, quadruped_low::Species::Lavadrake => 4.0,
_ => 6.0, _ => 6.0,
}, },
Body::Ship(_) => 1.0, Body::Ship(_) => 0.1,
} }
} }
pub fn can_fly(&self) -> bool { pub fn can_fly(&self) -> Option<f32> {
matches!( match self {
self, Body::BirdMedium(_) | Body::Dragon(_) | Body::BirdSmall(_) => Some(1.0),
Body::BirdMedium(_) | Body::Dragon(_) | Body::BirdSmall(_) | Body::Ship(ship::Body::DefaultAirship) Body::Ship(ship::Body::DefaultAirship) => Some(1.5),
) _ => None,
}
} }
pub fn can_climb(&self) -> bool { matches!(self, Body::Humanoid(_)) } pub fn can_climb(&self) -> bool { matches!(self, Body::Humanoid(_)) }
@ -182,8 +183,8 @@ impl Body {
pub fn handle_move(data: &JoinData, update: &mut StateUpdate, efficiency: f32) { pub fn handle_move(data: &JoinData, update: &mut StateUpdate, efficiency: f32) {
if let Some(depth) = data.physics.in_liquid { if let Some(depth) = data.physics.in_liquid {
swim_move(data, update, efficiency, depth); swim_move(data, update, efficiency, depth);
} else if data.inputs.fly.is_pressed() && !data.physics.on_ground && data.body.can_fly() { } else if data.inputs.fly.is_pressed() && !data.physics.on_ground && data.body.can_fly().is_some() {
fly_move(data, update, efficiency); fly_move(data, update, efficiency * data.body.can_fly().unwrap());
} else { } else {
basic_move(data, update, efficiency); basic_move(data, update, efficiency);
} }

View File

@ -414,7 +414,7 @@ impl<'a> PhysicsSystemData<'a> {
let old_vel = vel; let old_vel = vel;
// Integrate forces // Integrate forces
// Friction is assumed to be a constant dependent on location // Friction is assumed to be a constant dependent on location
let friction = FRIC_AIR let friction = if physics_state.on_ground { 0.0 } else { FRIC_AIR }
// .max(if physics_state.on_ground { // .max(if physics_state.on_ground {
// FRIC_GROUND // FRIC_GROUND
// } else { // } else {
@ -968,7 +968,9 @@ fn cylinder_voxel_collision<'a, T: BaseVol<Vox = Block> + ReadVol>(
if on_ground { if on_ground {
physics_state.on_ground = true; physics_state.on_ground = true;
vel.0 = ground_vel + (vel.0 - ground_vel) * (1.0 - FRIC_GROUND.min(1.0)).powf(dt.0 * 60.0); vel.0 = ground_vel + (vel.0 - ground_vel) * (1.0 - FRIC_GROUND.min(1.0)).powf(dt.0 * 60.0);
physics_state.ground_vel = ground_vel;
// If the space below us is free, then "snap" to the ground // If the space below us is free, then "snap" to the ground
} else if collision_with( } else if collision_with(
pos.0 - Vec3::unit_z() * 1.05, pos.0 - Vec3::unit_z() * 1.05,

View File

@ -207,7 +207,7 @@ impl<'a> System<'a> for Sys {
in_liquid: physics_state.in_liquid.is_some(), in_liquid: physics_state.in_liquid.is_some(),
min_tgt_dist: 1.0, min_tgt_dist: 1.0,
can_climb: body.map(|b| b.can_climb()).unwrap_or(false), can_climb: body.map(|b| b.can_climb()).unwrap_or(false),
can_fly: body.map(|b| b.can_fly()).unwrap_or(false), can_fly: body.map(|b| b.can_fly().is_some()).unwrap_or(false),
}; };
let flees = alignment let flees = alignment