Stop epsilon and deceleration
This commit is contained in:
parent
1820df9f24
commit
83ae5ed3fe
1 changed files with 41 additions and 7 deletions
|
|
@ -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(
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue