From 83ae5ed3fe8f61c8145aa8100904e45f0b23e044 Mon Sep 17 00:00:00 2001 From: Rendo Date: Sat, 15 Nov 2025 20:48:04 +0500 Subject: [PATCH] Stop epsilon and deceleration --- src/ships/player.rs | 48 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 7 deletions(-) diff --git a/src/ships/player.rs b/src/ships/player.rs index fad48c5..58cdb2b 100644 --- a/src/ships/player.rs +++ b/src/ships/player.rs @@ -10,7 +10,9 @@ use bevy::prelude::*; #[derive(Component)] #[require(Velocity)] pub struct PlayerMovement { - pub(super) acceleration: f32, + acceleration: f32, + deceleration: f32, + stop_epsilon: f32, } #[derive(Component)] @@ -21,7 +23,11 @@ pub struct PlayerGun { pub fn spawn_player(commands: &mut Commands, sprite: Handle, at: Vec2) { commands.spawn(( - PlayerMovement { acceleration: 100. }, + PlayerMovement { + acceleration: 100., + deceleration: 300., + stop_epsilon: 50., + }, PlayerGun { shoot_timer: Timer::from_seconds(0.2, TimerMode::Once), damage: 1, @@ -39,7 +45,7 @@ pub(super) fn player_movement_system( keyboard_input: Res>, query: Single<(&mut Velocity, &PlayerMovement)>, ) { - let (mut movable, player) = query.into_inner(); + let (mut velocity, player) = query.into_inner(); let mut movement_factor = 0.0; let mut rotation_factor = 0.0; @@ -58,10 +64,38 @@ pub(super) fn player_movement_system( movement_factor -= 1.0; } - movable.linear_speed = (movable.linear_speed - + movement_factor * player.acceleration * time.delta_secs()) - .clamp(-movable.max_linear_speed, movable.max_linear_speed); - movable.rotation_speed = rotation_factor * movable.max_rotation_speed; + if movement_factor > 0. { + if velocity.linear_speed >= 0. { + velocity.linear_speed = (velocity.linear_speed + + movement_factor * player.acceleration * time.delta_secs()) + .clamp(-velocity.max_linear_speed, velocity.max_linear_speed); + } else { + velocity.linear_speed = (velocity.linear_speed + + movement_factor * player.deceleration * time.delta_secs()) + .clamp(-velocity.max_linear_speed, velocity.max_linear_speed); + + if velocity.linear_speed > -player.stop_epsilon { + velocity.linear_speed = 0; + } + } + } + if movement_factor < 0. { + if velocity.linear_speed <= 0. { + velocity.linear_speed = (velocity.linear_speed + - movement_factor * player.acceleration * time.delta_secs()) + .clamp(-velocity.max_linear_speed, velocity.max_linear_speed); + } else { + velocity.linear_speed = (velocity.linear_speed + - movement_factor * player.deceleration * time.delta_secs()) + .clamp(-velocity.max_linear_speed, velocity.max_linear_speed); + + if velocity.linear_speed < player.stop_epsilon { + velocity.linear_speed = 0; + } + } + } + + velocity.rotation_speed = rotation_factor * velocity.max_rotation_speed; } pub fn player_shooting_system(