Stop epsilon and deceleration

This commit is contained in:
Rendo 2025-11-15 20:48:04 +05:00
commit 83ae5ed3fe

View file

@ -10,7 +10,9 @@ use bevy::prelude::*;
#[derive(Component)] #[derive(Component)]
#[require(Velocity)] #[require(Velocity)]
pub struct PlayerMovement { pub struct PlayerMovement {
pub(super) acceleration: f32, acceleration: f32,
deceleration: f32,
stop_epsilon: f32,
} }
#[derive(Component)] #[derive(Component)]
@ -21,7 +23,11 @@ pub struct PlayerGun {
pub fn spawn_player(commands: &mut Commands, sprite: Handle<Image>, at: Vec2) { pub fn spawn_player(commands: &mut Commands, sprite: Handle<Image>, at: Vec2) {
commands.spawn(( commands.spawn((
PlayerMovement { acceleration: 100. }, PlayerMovement {
acceleration: 100.,
deceleration: 300.,
stop_epsilon: 50.,
},
PlayerGun { PlayerGun {
shoot_timer: Timer::from_seconds(0.2, TimerMode::Once), shoot_timer: Timer::from_seconds(0.2, TimerMode::Once),
damage: 1, damage: 1,
@ -39,7 +45,7 @@ pub(super) fn player_movement_system(
keyboard_input: Res<ButtonInput<KeyCode>>, keyboard_input: Res<ButtonInput<KeyCode>>,
query: Single<(&mut Velocity, &PlayerMovement)>, 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 movement_factor = 0.0;
let mut rotation_factor = 0.0; let mut rotation_factor = 0.0;
@ -58,10 +64,38 @@ pub(super) fn player_movement_system(
movement_factor -= 1.0; movement_factor -= 1.0;
} }
movable.linear_speed = (movable.linear_speed if movement_factor > 0. {
if velocity.linear_speed >= 0. {
velocity.linear_speed = (velocity.linear_speed
+ movement_factor * player.acceleration * time.delta_secs()) + movement_factor * player.acceleration * time.delta_secs())
.clamp(-movable.max_linear_speed, movable.max_linear_speed); .clamp(-velocity.max_linear_speed, velocity.max_linear_speed);
movable.rotation_speed = rotation_factor * movable.max_rotation_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( pub fn player_shooting_system(