Sailing physics sketching

This commit is contained in:
JP Stringham
2025-11-28 10:16:58 -05:00
parent d6c706ed0b
commit 904b0bb5db

View File

@@ -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<AssetServer>, 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<ButtonInput<KeyCode>>) {
fn handle_keys(mut q_player: Query<&mut InputState>, keys: Res<ButtonInput<KeyCode>>) {
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;