Speed and weapon bobbing change on sprint, crouch and aim

This commit is contained in:
Franklin 2023-12-04 18:15:26 -04:00
parent dd9496d110
commit d1c5cdd9b9
4 changed files with 40 additions and 19 deletions

View File

@ -27,6 +27,7 @@ pub struct PlayerFiringInfo {
/// This is specifically for situations where the player is holding a gun that is stuck against a wall, and should not be false
/// until the gun stops colliding with the wall.
pub gun_colliding_with_object: bool,
pub is_aiming: bool,
}
impl Default for PlayerFiringInfo {
@ -40,6 +41,7 @@ impl Default for PlayerFiringInfo {
gun_ready_pose: GunReadyPose::LowReady,
is_inspecting: false,
gun_colliding_with_object: false,
is_aiming: false,
}
}
}

View File

@ -1,7 +1,7 @@
use bevy::prelude::*;
use bevy_rapier3d::dynamics::Velocity;
use crate::comps::core::markers::{player::Player, holdable::InPlayerHands, firearm_scene::FirearmScene};
use crate::{comps::core::markers::{player::Player, holdable::InPlayerHands, firearm_scene::FirearmScene}, logic::core::guns::player_firing::PlayerFiringInfo};
use super::{player_movement::{PlayerLinearYState, PlayerMovementInput, PlayerLinearXZState}, camera_player_sync::HandSwaying};
@ -20,7 +20,7 @@ const BOBBING_LIMIT: Vec3 = Vec3 { x: 0.01, y: 0.01, z: 0.01 };
const BOBBING_ROT_MULTIPLIER: Vec3 = Vec3 { x: 2.0, y: 2.0, z: 2.0};
pub fn hand_bobbing_on_player_movement(
player_query: Query<(&Velocity, &PlayerLinearYState, &PlayerLinearXZState, &PlayerMovementInput), With<Player>>,
player_query: Query<(&Velocity, &PlayerLinearYState, &PlayerLinearXZState, &PlayerMovementInput, &PlayerFiringInfo), With<Player>>,
in_player_hands_query: Query<(Entity, &HandSwaying), With<InPlayerHands>>,
mut firearm_scene_query: Query<(&Parent, &mut Transform, &mut HandBobbing), (With<Handle<Scene>>, With<FirearmScene>)>,
@ -29,8 +29,19 @@ pub fn hand_bobbing_on_player_movement(
for (in_player_hands, hand_swaying) in in_player_hands_query.iter() {
for (firearm_scene_parent, mut firearm_scene_transform, mut hand_bobbing) in firearm_scene_query.iter_mut() {
if in_player_hands == firearm_scene_parent.get() {
for (player_velocity, player_linear_y_state, player_linear_xz_state, player_movement_input) in player_query.iter() {
for (player_velocity, player_linear_y_state, player_linear_xz_state, player_movement_input, player_firing_info) in player_query.iter() {
let bobbing_limit = BOBBING_LIMIT *
if player_linear_xz_state.is_sprinting() { 2.0 } else { 1.0 } *
if player_linear_xz_state.is_crouched() { 0.9 } else { 1.0 } *
if player_firing_info.is_aiming { 0.6 } else { 1.0 };
let travel_limit = TRAVEL_LIMIT *
if player_linear_xz_state.is_sprinting() { 1.0 } else { 1.0 } *
if player_linear_xz_state.is_crouched() { 0.9 } else { 1.0 } *
if player_firing_info.is_aiming { 0.6 } else { 1.0 };
let bobbing_rot_multiplier = BOBBING_ROT_MULTIPLIER *
if player_linear_xz_state.is_sprinting() { 2.0 } else { 1.0 } *
if player_linear_xz_state.is_crouched() { 0.9 } else { 1.0 } *
if player_firing_info.is_aiming { 0.6 } else { 1.0 };
// Speed curve
hand_bobbing.speed_curve += time.delta_seconds() *
if player_linear_y_state.is_grounded(&0.25) {
@ -38,28 +49,28 @@ pub fn hand_bobbing_on_player_movement(
} else { 1.0 };
// Bobbing translation
hand_bobbing.bob_position.x = (hand_bobbing.speed_curve.cos() * BOBBING_LIMIT.x * (
hand_bobbing.bob_position.x = (hand_bobbing.speed_curve.cos() * bobbing_limit.x * (
if player_linear_y_state.is_grounded(&0.25) { 1.0 } else { 0.0 }
)) - (player_movement_input.get_horizontal_value_normalized() * TRAVEL_LIMIT.x);
)) - (player_movement_input.get_horizontal_value_normalized() * travel_limit.x);
hand_bobbing.bob_position.y = (hand_bobbing.speed_curve.sin() * BOBBING_LIMIT.y) - (player_velocity.linvel.y * TRAVEL_LIMIT.y);
hand_bobbing.bob_position.y = (hand_bobbing.speed_curve.sin() * bobbing_limit.y) - (player_velocity.linvel.y * travel_limit.y);
hand_bobbing.bob_position.z = player_movement_input.get_vertical_value_normalized() * TRAVEL_LIMIT.z * -1.0;
hand_bobbing.bob_position.z = player_movement_input.get_vertical_value_normalized() * travel_limit.z * -1.0;
// Bobbing rotation
let input = player_movement_input.get_input();
hand_bobbing.bob_euler_rotation.x = if input == Vec2::ZERO {
BOBBING_ROT_MULTIPLIER.x * ((hand_bobbing.speed_curve * 2.0).sin() / 2.0)
bobbing_rot_multiplier.x * ((hand_bobbing.speed_curve * 2.0).sin() / 2.0)
} else {
BOBBING_ROT_MULTIPLIER.x * (hand_bobbing.speed_curve * 2.0).sin()
bobbing_rot_multiplier.x * (hand_bobbing.speed_curve * 2.0).sin()
};
hand_bobbing.bob_euler_rotation.y = if input == Vec2::ZERO { 0.0 } else {
BOBBING_ROT_MULTIPLIER.y * hand_bobbing.speed_curve.cos()
bobbing_rot_multiplier.y * hand_bobbing.speed_curve.cos()
};
hand_bobbing.bob_euler_rotation.z = if input == Vec2::ZERO { 0.0 } else {
BOBBING_ROT_MULTIPLIER.z * hand_bobbing.speed_curve.cos() * input.x
bobbing_rot_multiplier.z * hand_bobbing.speed_curve.cos() * input.x
};
// Applying bobbing + sway to actual transform

View File

@ -203,6 +203,7 @@ pub fn capture_hand_usage(
&& !resources.game_ui_state.any_window() && !player_linear_xz_state.is_sprinting()
&& !player_firing_info.gun_colliding_with_object
{
player_firing_info.is_aiming = true;
player_firing_info.gun_ready_pose = GunReadyPose::HighReady;
let rotation_lerp_quat = in_hand_transform.rotation.lerp(
firearm_data.final_aimed_rotation + resources.player_settings.rot_aimed_offset,
@ -229,6 +230,7 @@ pub fn capture_hand_usage(
}
}
} else {
player_firing_info.is_aiming = false;
in_hand_transform.rotation = in_hand_transform.rotation.lerp(
firearm_data.rotation_offset + resources.player_settings.rot_offset,
(resources.time.delta_seconds()

View File

@ -151,6 +151,11 @@ pub fn move_player(
} else {
1.0
};
let aimed_in_multiplier = if player_firing_info.is_aiming {
0.6
} else {
1.0
};
let local_z = player_transform.local_z();
let forward = -Vec3::new(local_z.x, 0.0, local_z.z);
let right = Vec3::new(local_z.z, 0.0, -local_z.x);
@ -167,7 +172,7 @@ pub fn move_player(
forward,
player_velocity.linvel,
time.delta_seconds(),
sprint_multiplier * crouch_multiplier,
sprint_multiplier * crouch_multiplier * aimed_in_multiplier,
player_values_state.player_acceleration,
);
}
@ -182,7 +187,7 @@ pub fn move_player(
-forward,
player_velocity.linvel,
time.delta_seconds(),
crouch_multiplier,
crouch_multiplier * aimed_in_multiplier,
player_values_state.player_acceleration,
);
}
@ -202,7 +207,7 @@ pub fn move_player(
* crouch_multiplier
} else {
player_values_state.player_lateral_acceleration_multiplier
* crouch_multiplier
* crouch_multiplier * aimed_in_multiplier
},
player_values_state.player_acceleration,
);
@ -223,7 +228,7 @@ pub fn move_player(
* crouch_multiplier
} else {
player_values_state.player_lateral_acceleration_multiplier
* crouch_multiplier
* crouch_multiplier * aimed_in_multiplier
},
player_values_state.player_acceleration,
);
@ -250,9 +255,10 @@ pub fn move_player(
player_velocity.linvel.x = player_values_state.max_linear_player_velocity
* crouch_multiplier
* sprint_multiplier
* aimed_in_multiplier
} else {
player_velocity.linvel.x =
player_values_state.max_linear_player_velocity * -1.0 * crouch_multiplier
player_values_state.max_linear_player_velocity * -1.0 * crouch_multiplier * aimed_in_multiplier
}
}
if player_velocity.linvel.z.abs()
@ -261,10 +267,10 @@ pub fn move_player(
let positive = player_velocity.linvel.z.is_sign_positive();
if positive {
player_velocity.linvel.z =
player_values_state.max_linear_player_velocity * crouch_multiplier * sprint_multiplier
player_values_state.max_linear_player_velocity * crouch_multiplier * sprint_multiplier * aimed_in_multiplier
} else {
player_velocity.linvel.z =
player_values_state.max_linear_player_velocity * -1.0 * crouch_multiplier * sprint_multiplier
player_values_state.max_linear_player_velocity * -1.0 * crouch_multiplier * sprint_multiplier * aimed_in_multiplier
}
}
if player_velocity.linvel.x > -1.0