Files
shinespark/src/fighter/state/air.rs
T

61 lines
2.4 KiB
Rust

use bevy::prelude::*;
use fixed::traits::Fixed;
use crate::fighter::*;
pub fn integrate_gravity(velocity: &mut FighterVelocity, attributes: &FighterAttributes) {
velocity.y -= attributes.gravity;
velocity.y = velocity.y.max(-attributes.terminal_velocity);
}
pub fn apply_air_drift(velocity: &mut FighterVelocity, attribs: &FighterAttributes, input: &FighterInput) {
if input.get_last_frame().movement.x.is_zero() {
if velocity.x.abs() < attribs.air_friction {
velocity.x = FGi32::ZERO;
} else {
let velocity_sign = velocity.x.signum();
velocity.x += (-velocity_sign) * attribs.air_friction;
}
} else {
let target_velocity = input.get_last_frame().movement.x.signum() * attribs.max_air_horizontal_velocity;
let acceleration = input.get_last_frame().movement.x.signum() * attribs.air_acceleration_base;
let mut acceleration = acceleration + input.get_last_frame().movement.x * attribs.air_acceleration_stick;
let velocity_x = velocity.x;
if !(velocity_x * acceleration < FGi32::ZERO) {
if acceleration > FGi32::ZERO {
if velocity_x + acceleration > target_velocity {
acceleration = -attribs.air_friction;
if velocity_x + acceleration < target_velocity {
acceleration = target_velocity - velocity_x;
}
if velocity_x + acceleration > attribs.max_air_horizontal_velocity {
acceleration = attribs.max_air_horizontal_velocity - velocity_x;
}
}
} else if velocity_x + acceleration < target_velocity {
acceleration = attribs.air_friction;
if velocity_x + acceleration > target_velocity {
acceleration = target_velocity - velocity_x;
}
if velocity_x + acceleration < -attribs.max_air_horizontal_velocity {
acceleration = -attribs.max_air_horizontal_velocity - velocity_x;
}
}
}
velocity.x += acceleration;
}
}
pub fn apply_air_motion(
velocity: &FighterVelocity,
translation: &mut FighterTranslation,
prev_translation: &mut FighterPreviousTranslation,
) {
// Vertical velocity should be 0 on the ground
prev_translation.0 = translation.0;
translation.0 += velocity.0;
}