fixed formatting errors reported by cargo fmt
This commit is contained in:
parent
c494f7db80
commit
da1629bc1a
3 changed files with 78 additions and 59 deletions
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
45
src/lib.rs
45
src/lib.rs
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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() {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue