fixed formatting errors reported by cargo fmt

This commit is contained in:
NIMFER 2024-03-28 19:49:21 +01:00
parent c494f7db80
commit da1629bc1a
3 changed files with 78 additions and 59 deletions

View file

@ -20,19 +20,10 @@ use bevy_xpbd_3d::{math::*, prelude::*};
pub struct CharacterControllerPlugin; pub struct CharacterControllerPlugin;
impl Plugin for CharacterControllerPlugin{ impl Plugin for CharacterControllerPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_systems(Update,( app.add_systems(Update, (keyboard_input, move_character));
keyboard_input, app.add_systems(FixedUpdate, (dampen_movement, update_grounded));
move_character,
)
);
app.add_systems(FixedUpdate, (
dampen_movement,
update_grounded
)
);
app.add_event::<MovementAction>(); app.add_event::<MovementAction>();
} }
} }
@ -40,7 +31,7 @@ impl Plugin for CharacterControllerPlugin{
#[derive(Event)] #[derive(Event)]
pub enum MovementAction { pub enum MovementAction {
Move(Vector2), Move(Vector2),
Jump Jump,
} }
#[derive(Component)] #[derive(Component)]
@ -48,7 +39,7 @@ pub enum MovementAction {
pub struct Grounded; pub struct Grounded;
#[derive(Component)] #[derive(Component)]
pub struct CharacterController{ pub struct CharacterController {
pub movement_acceleration: Scalar, pub movement_acceleration: Scalar,
pub air_control_factor: Scalar, pub air_control_factor: Scalar,
pub movement_dampening_factor: Scalar, pub movement_dampening_factor: Scalar,
@ -58,7 +49,7 @@ pub struct CharacterController{
impl Default for CharacterController { impl Default for CharacterController {
fn default() -> Self { fn default() -> Self {
CharacterController{ CharacterController {
movement_acceleration: 20.0, movement_acceleration: 20.0,
air_control_factor: 0.5, air_control_factor: 0.5,
movement_dampening_factor: 0.95, movement_dampening_factor: 0.95,
@ -69,7 +60,7 @@ impl Default for CharacterController {
} }
#[derive(Bundle)] #[derive(Bundle)]
pub struct CharacterControllerBundle{ pub struct CharacterControllerBundle {
character_controller: CharacterController, character_controller: CharacterController,
rigid_body: RigidBody, rigid_body: RigidBody,
collider: Collider, collider: Collider,
@ -83,8 +74,7 @@ impl CharacterControllerBundle {
let mut caster_shape = controller_collider.clone(); let mut caster_shape = controller_collider.clone();
caster_shape.set_scale(Vector::ONE * 0.99, 10); caster_shape.set_scale(Vector::ONE * 0.99, 10);
Self {
Self{
character_controller: controller, character_controller: controller,
rigid_body: RigidBody::Dynamic, rigid_body: RigidBody::Dynamic,
collider: controller_collider, collider: controller_collider,
@ -93,7 +83,8 @@ impl CharacterControllerBundle {
Vector::ZERO, Vector::ZERO,
Quaternion::default(), Quaternion::default(),
Direction3d::NEG_Y, Direction3d::NEG_Y,
).with_max_time_of_impact(0.2), )
.with_max_time_of_impact(0.2),
locked_axis: LockedAxes::ROTATION_LOCKED, locked_axis: LockedAxes::ROTATION_LOCKED,
restitution: Restitution::new(0.0), restitution: Restitution::new(0.0),
} }
@ -110,14 +101,18 @@ impl Default for CharacterControllerBundle {
} }
} }
pub fn update_grounded(mut commands: Commands, mut query: Query<(Entity, &CharacterController, &Rotation, &ShapeHits)>){ pub fn update_grounded(
mut commands: Commands,
mut query: Query<(Entity, &CharacterController, &Rotation, &ShapeHits)>,
) {
for (entity, character_controller, rotation, hits) in &mut query { for (entity, character_controller, rotation, hits) in &mut query {
let is_grounded = hits.iter().any(|hit| { let is_grounded = hits.iter().any(|hit| {
let angle = rotation.rotate(-hit.normal2).angle_between(Vector::Y).abs(); let angle = rotation.rotate(-hit.normal2).angle_between(Vector::Y).abs();
println!("slope angle: {} / {}", angle, character_controller.max_slope_angle); println!(
"slope angle: {} / {}",
angle, character_controller.max_slope_angle
);
angle <= character_controller.max_slope_angle angle <= character_controller.max_slope_angle
}); });
@ -130,10 +125,12 @@ pub fn update_grounded(mut commands: Commands, mut query: Query<(Entity, &Charac
commands.entity(entity).remove::<Grounded>(); commands.entity(entity).remove::<Grounded>();
} }
} }
} }
pub fn keyboard_input(mut movement_event_writer: EventWriter<MovementAction>, keyboard_input: Res<ButtonInput<KeyCode>>){ pub fn keyboard_input(
mut movement_event_writer: EventWriter<MovementAction>,
keyboard_input: Res<ButtonInput<KeyCode>>,
) {
let up = keyboard_input.any_pressed([KeyCode::KeyW, KeyCode::ArrowUp]); let up = keyboard_input.any_pressed([KeyCode::KeyW, KeyCode::ArrowUp]);
let down = keyboard_input.any_pressed([KeyCode::KeyS, KeyCode::ArrowDown]); let down = keyboard_input.any_pressed([KeyCode::KeyS, KeyCode::ArrowDown]);
let left = keyboard_input.any_pressed([KeyCode::KeyA, KeyCode::ArrowLeft]); let left = keyboard_input.any_pressed([KeyCode::KeyA, KeyCode::ArrowLeft]);
@ -155,9 +152,14 @@ pub fn keyboard_input(mut movement_event_writer: EventWriter<MovementAction>, ke
pub fn move_character( pub fn move_character(
time: Res<Time>, time: Res<Time>,
mut movement_event_reader: EventReader<MovementAction>, mut movement_event_reader: EventReader<MovementAction>,
mut query: Query<(&mut LinearVelocity, &CharacterController, Has<Grounded>, &Rotation, &ShapeHits)>, mut query: Query<(
) &mut LinearVelocity,
{ &CharacterController,
Has<Grounded>,
&Rotation,
&ShapeHits,
)>,
) {
let delta_time = time.delta_seconds_f64().adjust_precision(); let delta_time = time.delta_seconds_f64().adjust_precision();
for event in movement_event_reader.read() { for event in movement_event_reader.read() {
@ -167,19 +169,33 @@ pub fn move_character(
if is_grounded { if is_grounded {
let mut slope_factor = 1.0; let mut slope_factor = 1.0;
for hit in shape_hits.iter() { for hit in shape_hits.iter() {
let angle = rotation.rotate(-hit.normal2).angle_between(Vector::Y).abs(); let angle =
rotation.rotate(-hit.normal2).angle_between(Vector::Y).abs();
if angle <= character_controller.max_slope_angle { if angle <= character_controller.max_slope_angle {
slope_factor *= (angle / character_controller.max_slope_angle).cos(); slope_factor *=
velocity.x += direction.x * character_controller.movement_acceleration * slope_factor * delta_time; (angle / character_controller.max_slope_angle).cos();
velocity.z -= direction.y * character_controller.movement_acceleration * slope_factor * delta_time; velocity.x += direction.x
* character_controller.movement_acceleration
* slope_factor
* delta_time;
velocity.z -= direction.y
* character_controller.movement_acceleration
* slope_factor
* delta_time;
} else { } else {
velocity.x = 0.0; velocity.x = 0.0;
velocity.z = 0.0; velocity.z = 0.0;
} }
} }
} else { } else {
velocity.x += direction.x * character_controller.movement_acceleration * character_controller.air_control_factor * delta_time ; velocity.x += direction.x
velocity.z -= direction.y * character_controller.movement_acceleration * character_controller.air_control_factor * delta_time ; * character_controller.movement_acceleration
* character_controller.air_control_factor
* delta_time;
velocity.z -= direction.y
* character_controller.movement_acceleration
* character_controller.air_control_factor
* delta_time;
} }
} }
MovementAction::Jump => { MovementAction::Jump => {
@ -192,12 +208,10 @@ pub fn move_character(
} }
} }
pub fn dampen_movement(mut qeury: Query<(&mut LinearVelocity, &CharacterController)>) {
pub fn dampen_movement(mut qeury: Query<(&mut LinearVelocity, &CharacterController)>){
for (mut velocity, character_controller) in &mut qeury { for (mut velocity, character_controller) in &mut qeury {
// We could use `LinearDamping`, but we don't want to dampen movement along the Y axis // We could use `LinearDamping`, but we don't want to dampen movement along the Y axis
velocity.x *= character_controller.movement_dampening_factor; velocity.x *= character_controller.movement_dampening_factor;
velocity.z *= character_controller.movement_dampening_factor; velocity.z *= character_controller.movement_dampening_factor;
} }
} }

View file

@ -17,11 +17,11 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#![allow(clippy::type_complexity)] #![allow(clippy::type_complexity)]
use bevy::prelude::*;
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}; use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin};
use bevy_xpbd_3d::prelude::*; use bevy::prelude::*;
use bevy_editor_pls::prelude::*; use bevy_editor_pls::prelude::*;
use bevy_xpbd_3d::prelude::*;
mod charcacter_controller; mod charcacter_controller;
use charcacter_controller::*; use charcacter_controller::*;
@ -29,16 +29,17 @@ pub struct GamePlugin;
impl Plugin for GamePlugin { impl Plugin for GamePlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_plugins(( app.add_plugins((PhysicsPlugins::default(), CharacterControllerPlugin))
PhysicsPlugins::default(), .add_systems(Startup, setup)
CharacterControllerPlugin, .add_systems(Update, spawn_map);
))
.add_systems(Startup, setup)
.add_systems(Update, spawn_map);
#[cfg(debug_assertions)] #[cfg(debug_assertions)]
{ {
app.add_plugins((FrameTimeDiagnosticsPlugin, EditorPlugin::default(), LogDiagnosticsPlugin::default())); app.add_plugins((
FrameTimeDiagnosticsPlugin,
EditorPlugin::default(),
LogDiagnosticsPlugin::default(),
));
} }
app.world.init_resource::<IsMapSpawned>(); app.world.init_resource::<IsMapSpawned>();
@ -54,14 +55,16 @@ fn setup(
mut meshes: ResMut<Assets<Mesh>>, mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>, mut materials: ResMut<Assets<StandardMaterial>>,
) { ) {
//player //player
commands.spawn((CharacterControllerBundle::new(Collider::capsule(1.0, 0.5), CharacterController::default()), PbrBundle{ commands.spawn((
mesh: meshes.add(Capsule3d::new(0.5, 1.0)), CharacterControllerBundle::new(Collider::capsule(1.0, 0.5), CharacterController::default()),
material: materials.add(Color::rgb_u8(124, 144, 255)), PbrBundle {
transform: Transform::from_xyz(0.0, 5.0, 0.0), mesh: meshes.add(Capsule3d::new(0.5, 1.0)),
..default() material: materials.add(Color::rgb_u8(124, 144, 255)),
})); transform: Transform::from_xyz(0.0, 5.0, 0.0),
..default()
},
));
// light // light
commands.spawn(PointLightBundle { commands.spawn(PointLightBundle {
point_light: PointLight { point_light: PointLight {
@ -82,8 +85,10 @@ fn spawn_map(
asset_server: Res<AssetServer>, asset_server: Res<AssetServer>,
mut is_map_spawned: ResMut<IsMapSpawned>, mut is_map_spawned: ResMut<IsMapSpawned>,
mut commands: Commands, mut commands: Commands,
){ ) {
if is_map_spawned.0 {return;} if is_map_spawned.0 {
return;
}
let scene = asset_server.load("test_map.gltf#Scene0"); let scene = asset_server.load("test_map.gltf#Scene0");
@ -96,8 +101,8 @@ fn spawn_map(
AsyncSceneCollider::new(Some(ComputedCollider::TriMesh)), AsyncSceneCollider::new(Some(ComputedCollider::TriMesh)),
RigidBody::Static, RigidBody::Static,
)); ));
println!("map spawned!"); println!("map spawned!");
is_map_spawned.0 = true is_map_spawned.0 = true
} }

View file

@ -23,8 +23,8 @@ use bevy::prelude::*;
use bevy::window::PrimaryWindow; use bevy::window::PrimaryWindow;
use bevy::winit::WinitWindows; use bevy::winit::WinitWindows;
use bevy::DefaultPlugins; use bevy::DefaultPlugins;
use ttt_ce::GamePlugin;
use std::io::Cursor; use std::io::Cursor;
use ttt_ce::GamePlugin;
use winit::window::Icon; use winit::window::Icon;
fn main() { fn main() {