diff options
author | jacopograndi <jacopo.grandi@outlook.it> | 2022-06-27 20:54:40 +0200 |
---|---|---|
committer | jacopograndi <jacopo.grandi@outlook.it> | 2022-06-27 20:54:40 +0200 |
commit | 8fbc6aac484e06252ed852ca9222f6c4c6e71b06 (patch) | |
tree | 9acb3f7edeeb73c321599471e9ef9412f14eb380 | |
parent | 1d7de54990c953c9440f0752e84ef6cd21ba0ec3 (diff) |
speed
-rw-r--r-- | src/main.rs | 71 |
1 files changed, 50 insertions, 21 deletions
diff --git a/src/main.rs b/src/main.rs index a3190bb..8b5121b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,20 +13,25 @@ use bevy::{ sprite::{MaterialMesh2dBundle, collide_aabb::collide}, render::camera::ScalingMode, ecs::system::EntityCommands, - math::Vec3Swizzles + math::Vec3Swizzles, + core::FixedTimestep, }; use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}; + fn main() { App::new() .add_plugins(DefaultPlugins) .add_startup_system(spawn_camera) .add_startup_system(setup) - .add_system(movement.label("movement")) - .add_system(camera_follow.after("movement")) .add_plugin(LogDiagnosticsPlugin::default()) .add_plugin(FrameTimeDiagnosticsPlugin::default()) + .add_stage_after(CoreStage::Update, "physics", SystemStage::parallel() + .with_run_criteria(FixedTimestep::steps_per_second(60.0)) + .with_system(movement.label("movement")) + .with_system(camera_follow.after("movement")) + ) .run(); } @@ -48,7 +53,9 @@ fn camera_follow( } #[derive(Component, Inspectable)] -pub struct Player; +pub struct Player { + speed: Vec3, +} #[derive(Component, Clone)] pub struct Collider { @@ -76,47 +83,65 @@ fn wall_collision_check( } fn movement ( - mut player_query: Query<(&Player, &mut Transform)>, + mut player_query: Query<(&mut Player, &mut Transform)>, wall_query: Query<(&Transform, &Collider), (With<Collider>, Without<Player>)>, keyboard: Res<Input<KeyCode>>, time: Res<Time>, ) { - let (_player, mut transform) = player_query.single_mut(); + let (mut player, mut transform) = player_query.single_mut(); - let mut dy = 0.0; + let mut acc = Vec3::new(0.0, 0.0, 0.0); if keyboard.pressed(KeyCode::W) { - dy += 1.0 * time.delta_seconds(); + acc.y += 1.0; } if keyboard.pressed(KeyCode::S) { - dy -= 1.0 * time.delta_seconds(); + acc.y -= 1.0; } - - let mut dx = 0.0; if keyboard.pressed(KeyCode::A) { - dx -= 1.0 * time.delta_seconds(); + acc.x -= 1.0; } if keyboard.pressed(KeyCode::D) { - dx += 1.0 * time.delta_seconds(); + acc.x += 1.0; } + if acc.length_squared() > 1.0 { acc = acc.normalize(); } + acc *= time.delta_seconds(); - let target = transform.translation + Vec3::new(dx, 0.0, 0.0); + player.speed += acc * 0.1; + player.speed *= 0.8; + + let target = transform.translation + player.speed; if let Some(collider) = wall_collision_check(target, &wall_query) { if !collider.height { - transform.translation += Vec3::new(dx, 0.0, 0.0) * collider.speed_mul; + transform.translation += player.speed + * collider.speed_mul; + player.speed *= 0.8; + } else { + player.speed *= 0.0; } } else { transform.translation = target; } - - let target = transform.translation + Vec3::new(0.0, dy, 0.0); + /* + let target = transform.translation + Vec3::new(acc.x, 0.0, 0.0); if let Some(collider) = wall_collision_check(target, &wall_query) { if !collider.height { - transform.translation += Vec3::new(0.0, dy, 0.0) * collider.speed_mul; + transform.translation += Vec3::new(acc.x, 0.0, 0.0) + * collider.speed_mul; } } else { transform.translation = target; } + + let target = transform.translation + Vec3::new(0.0, acc.y, 0.0); + if let Some(collider) = wall_collision_check(target, &wall_query) { + if !collider.height { + transform.translation += Vec3::new(0.0, acc.y, 0.0) + * collider.speed_mul; + } + } else { + transform.translation = target; + }*/ } fn spawn_rect( @@ -172,10 +197,12 @@ fn setup_map( let size_big = Vec3::new( (wall[2] - wall[0] + 3) as f32, (wall[3] - wall[1] + 3) as f32, 1.0) * 0.002; + let movecenter = center - Vec3::new(0.0, 0.0, + if wall[4] == 2 { 1.0 } else { 0.0 }); commands.spawn_bundle(MaterialMesh2dBundle { mesh: meshes.add(Mesh::from(shape::Quad::default())).into(), transform: Transform { - translation: center, + translation: movecenter, scale: size_big, ..default() }, @@ -196,10 +223,12 @@ fn setup_map( 3 => Color::rgba(0.4, 0.4, 0.4, 1.0), _ => Color::rgba(1.0, 0.4, 0.03, 1.0), }; + let movecenter = center - Vec3::new(0.0, 0.0, + if wall[4] == 2 { 1.0 } else { 0.0 }); commands.spawn_bundle(MaterialMesh2dBundle { mesh: meshes.add(Mesh::from(shape::Quad::default())).into(), transform: Transform { - translation: center, + translation: movecenter, scale: size, ..default() }, @@ -232,7 +261,7 @@ fn setup( ..default() }) .push_children(&[color]) - .insert(Player); + .insert(Player { speed: Vec3::new(0.0, 0.0, 0.0) }); setup_map(commands, meshes, materials); } |