Playing with sails and rudders

This commit is contained in:
JP Stringham
2025-11-28 16:25:37 -05:00
parent b564b42ade
commit cf4beb0b9a

View File

@@ -18,6 +18,12 @@ struct InputState {
y: f32, y: f32,
} }
#[derive(Component, Default)]
struct SailboatState {
sail_extension: f32,
rudder_dir: f32,
}
fn main() { fn main() {
let mut app = App::new(); let mut app = App::new();
@@ -50,6 +56,7 @@ fn sprite_setup(assets: Res<AssetServer>, mut commands: Commands) {
}, },
EntityPhysics::default(), EntityPhysics::default(),
InputState::default(), InputState::default(),
SailboatState::default(),
)) ))
.with_child(( .with_child((
Sprite { Sprite {
@@ -93,28 +100,45 @@ fn handle_keys(mut q_player: Query<&mut InputState>, keys: Res<ButtonInput<KeyCo
} }
} }
fn player_physics(mut q_player: Query<(&InputState, &mut EntityPhysics, &mut Transform)>) { fn player_physics(
let Ok((input, mut physics, mut transform)) = q_player.single_mut() else { mut q_player: Query<(
&InputState,
&mut SailboatState,
&mut EntityPhysics,
&mut Transform,
)>,
) {
let Ok((input, mut boat_state, mut physics, mut transform)) = q_player.single_mut() else {
return; return;
}; };
if input.x < 0. { if input.x < 0. {
physics.turn_speed -= 0.1; boat_state.rudder_dir = (-1.0 + boat_state.rudder_dir) * 0.5;
} else if input.x > 0. { } else if input.x > 0. {
physics.turn_speed += 0.1; boat_state.rudder_dir = (1.0 + boat_state.rudder_dir) * 0.5;
} else { } else {
physics.turn_speed *= 0.99; boat_state.rudder_dir *= 0.5;
} }
physics.turn_speed *= 0.1;
physics.turn_speed += boat_state.rudder_dir * (physics.speed.abs() / MAX_SAILING_SPEED);
physics.turn_speed = physics.turn_speed.clamp(-MAX_TURN_SPEED, MAX_TURN_SPEED); physics.turn_speed = physics.turn_speed.clamp(-MAX_TURN_SPEED, MAX_TURN_SPEED);
physics.heading += physics.turn_speed * 0.1; physics.heading += physics.turn_speed * 0.1;
if input.y > 0. { if input.y > 0. {
physics.speed += 0.1; boat_state.sail_extension = (1.0 + boat_state.sail_extension) * 0.5;
} else if input.y < 0. { } else if input.y < 0. {
physics.speed -= 0.1; boat_state.sail_extension *= 0.5;
} else { }
physics.speed *= 0.999;
boat_state.sail_extension = boat_state.sail_extension.clamp(0., 1.);
physics.speed *= 0.99;
if boat_state.sail_extension > 0. {
physics.speed += 0.01 * boat_state.sail_extension;
} }
physics.speed = physics.speed.clamp(-MAX_SAILING_SPEED, MAX_SAILING_SPEED); physics.speed = physics.speed.clamp(-MAX_SAILING_SPEED, MAX_SAILING_SPEED);