From 904b0bb5db877bc18c256ce84b5cbad0162e548c Mon Sep 17 00:00:00 2001 From: JP Stringham Date: Fri, 28 Nov 2025 10:16:58 -0500 Subject: [PATCH] Sailing physics sketching --- src/main.rs | 67 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 48 insertions(+), 19 deletions(-) diff --git a/src/main.rs b/src/main.rs index 746f9af..39a0bec 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,23 @@ use bevy::prelude::*; -#[derive(Component)] +const MAX_SAILING_SPEED: f32 = 0.9; +const MAX_TURN_SPEED: f32 = 0.1; + +#[derive(Component, Default)] struct EntityPhysics { x: f32, y: f32, speed: f32, + turn_speed: f32, heading: f32, } +#[derive(Component, Default)] +struct InputState { + x: f32, + y: f32, +} + fn main() { let mut app = App::new(); @@ -36,42 +46,61 @@ fn sprite_setup(assets: Res, mut commands: Commands) { image: sprite_handle, ..default() }, - EntityPhysics { - x: 0., - y: 0., - speed: 0., - heading: 0., - }, + EntityPhysics::default(), + InputState::default(), )); } -fn handle_keys(mut q_player: Query<&mut EntityPhysics>, keys: Res>) { +fn handle_keys(mut q_player: Query<&mut InputState>, keys: Res>) { if keys.just_pressed(KeyCode::KeyQ) { info!("Quit."); } - let Ok(mut player) = q_player.single_mut() else { + let Ok(mut input) = q_player.single_mut() else { return; }; - if keys.just_pressed(KeyCode::ArrowUp) { - player.speed += 0.1; + if keys.pressed(KeyCode::ArrowUp) { + input.y = 1.; + } else if keys.pressed(KeyCode::ArrowDown) { + input.y = -1.; + } else { + input.y = 0.; } - if keys.just_pressed(KeyCode::ArrowRight) { - player.heading += 0.1; - } - - if keys.just_pressed(KeyCode::ArrowLeft) { - player.heading -= 0.1; + if keys.pressed(KeyCode::ArrowRight) { + input.x = 1.; + } else if keys.pressed(KeyCode::ArrowLeft) { + input.x = -1.; + } else { + input.x = 0.; } } -fn player_physics(mut q_player: Query<(&mut EntityPhysics, &mut Transform)>) { - let Ok((mut physics, mut transform)) = q_player.single_mut() else { +fn player_physics(mut q_player: Query<(&InputState, &mut EntityPhysics, &mut Transform)>) { + let Ok((input, mut physics, mut transform)) = q_player.single_mut() else { return; }; + if input.x < 0. { + physics.turn_speed -= 0.1; + } else if input.x > 0. { + physics.turn_speed += 0.1; + } + + physics.turn_speed = physics.turn_speed.clamp(-MAX_TURN_SPEED, MAX_TURN_SPEED); + physics.heading += physics.turn_speed * 0.1; + + if input.y > 0. { + physics.speed += 0.1; + } else if input.y < 0. { + physics.speed -= 0.1; + } else { + physics.speed *= 0.99; + } + + physics.speed = physics.speed.clamp(-MAX_SAILING_SPEED, MAX_SAILING_SPEED); + let x_speed = physics.heading.sin() * physics.speed; let y_speed = physics.heading.cos() * physics.speed;