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