From 3e9d23102d109af3364759fe3a73ace7505c0b0a Mon Sep 17 00:00:00 2001 From: MikolajG Date: Tue, 19 Mar 2024 21:07:57 +0100 Subject: [PATCH] added walking and jumping (no ground checking) --- src/charcacter_controller.rs | 74 +++++++++++++++++++++++++++++++++--- src/main.rs | 4 +- 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/src/charcacter_controller.rs b/src/charcacter_controller.rs index 8754e4b..91990a2 100644 --- a/src/charcacter_controller.rs +++ b/src/charcacter_controller.rs @@ -16,29 +16,45 @@ along with this program. If not, see . */ use bevy::prelude::*; -use bevy_xpbd_3d::prelude::*; +use bevy_xpbd_3d::{math::*, prelude::*}; pub struct CharacterControllerPlugin; impl Plugin for CharacterControllerPlugin{ fn build(&self, app: &mut App) { - app.add_systems(Update, update_grounded); + app.add_systems(Update,( + update_grounded, + keyboard_input, + move_character, + dampen_movement) + ); + app.add_event::(); } } +#[derive(Event)] +pub enum MovementAction { + Move(Vector2), + Jump +} + #[derive(Component)] #[component(storage = "SparseSet")] pub struct Grounded; #[derive(Component)] pub struct CharacterController{ - pub walk_speed: f32, + pub movement_acceleration: Scalar, + pub movement_dampening_factor: Scalar, + pub jump_impulse: Scalar, } impl Default for CharacterController { fn default() -> Self { CharacterController{ - walk_speed: 4.0, + movement_acceleration: 30.0, + movement_dampening_factor: 0.95, + jump_impulse: 7.0, } } } @@ -58,7 +74,6 @@ impl CharacterControllerBundle { rigid_body: RigidBody::Dynamic, collider: controller_collider, locked_axis: LockedAxes::ROTATION_LOCKED, - } } } @@ -79,4 +94,53 @@ pub fn update_grounded(mut character_controller_query: Query<&CharacterControlle for character_controller in character_controller_query.iter_mut() { } +} + +pub fn keyboard_input(mut movement_event_writer: EventWriter, keyboard_input: Res>){ + let up = keyboard_input.any_pressed([KeyCode::KeyW, KeyCode::ArrowUp]); + let down = keyboard_input.any_pressed([KeyCode::KeyS, KeyCode::ArrowDown]); + let left = keyboard_input.any_pressed([KeyCode::KeyA, KeyCode::ArrowLeft]); + let right = keyboard_input.any_pressed([KeyCode::KeyD, KeyCode::ArrowRight]); + + let horizontal = right as i8 - left as i8; + let vertical = up as i8 - down as i8; + let direction = Vector2::new(horizontal as Scalar, vertical as Scalar).clamp_length_max(1.0); + + if direction != Vector2::ZERO { + movement_event_writer.send(MovementAction::Move(direction)); + } + + if keyboard_input.just_pressed(KeyCode::Space) { + movement_event_writer.send(MovementAction::Jump); + } +} + +pub fn move_character(time: Res