diff --git a/src/components/mod.rs b/src/components/mod.rs index 621a4af..72af442 100644 --- a/src/components/mod.rs +++ b/src/components/mod.rs @@ -1,3 +1,4 @@ pub mod camera; // pub mod character_controller; +pub mod player; pub mod tags; diff --git a/src/components/player.rs b/src/components/player.rs new file mode 100644 index 0000000..a6091d5 --- /dev/null +++ b/src/components/player.rs @@ -0,0 +1,21 @@ +use bevy::prelude::*; +use bevy_rapier3d::prelude::GravityScale; + +#[derive(Component, Default, Reflect)] +#[require(PlayerVelocity)] +pub struct PlayerMotion(pub Vec3); + +#[derive(Component, Default, Reflect)] +pub struct PlayerForce(pub Vec3); + +#[derive(Component, Default, Reflect)] +#[require(GravityScale)] +pub struct GravityDirection(pub Option); + +impl GravityDirection { + pub const DOWN: GravityDirection = GravityDirection(Some(Dir3::NEG_Y)); + pub const NONE: GravityDirection = GravityDirection(None); +} + +#[derive(Component, Default, Reflect)] +pub struct PlayerVelocity(pub Vec3); diff --git a/src/components/tags.rs b/src/components/tags.rs index c740c39..aa07209 100644 --- a/src/components/tags.rs +++ b/src/components/tags.rs @@ -1,6 +1,9 @@ use bevy::prelude::*; +use crate::components::player::*; + #[derive(Component, Reflect)] +#[require(PlayerMotion, PlayerForce, GravityDirection)] pub struct Player; #[derive(Component, Reflect)] diff --git a/src/plugins/game.rs b/src/plugins/game.rs index da24d73..c207159 100644 --- a/src/plugins/game.rs +++ b/src/plugins/game.rs @@ -1,6 +1,7 @@ use crate::{ components::{ camera::{CameraPitch, CameraRoot, FollowCam, MainCamera, Unfocused}, + player::GravityDirection, tags::{Player, Ship}, }, plugins::*, @@ -47,6 +48,7 @@ fn setup_scene( .spawn(( Name::new("Player"), Player, + GravityDirection::DOWN, Collider::capsule_y(0.5, 0.5), RigidBody::KinematicPositionBased, KinematicCharacterController::default(), diff --git a/src/plugins/player.rs b/src/plugins/player.rs index 6299cad..31e51bb 100644 --- a/src/plugins/player.rs +++ b/src/plugins/player.rs @@ -1,22 +1,85 @@ use bevy::prelude::*; use bevy_rapier3d::prelude::*; -use crate::components::tags::Player; +use crate::components::{ + player::{GravityDirection, PlayerForce, PlayerMotion, PlayerVelocity}, + tags::Player, +}; pub struct PlayerPlugin; impl Plugin for PlayerPlugin { fn build(&self, app: &mut App) { - app.add_systems(PreUpdate, keyboard_input); + app.add_systems(PreUpdate, keyboard_input.in_set(PlayerInputSystems)); + app.add_systems(Update, (apply_gravity, apply_forces, apply_motion).chain()); } } +#[derive(SystemSet, Debug, Clone, PartialEq, Eq, Hash)] +pub struct PlayerInputSystems; + +fn apply_forces(player: Single<(&mut PlayerVelocity, &mut PlayerForce), With>, time: Res