aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjacopograndi <jacopo.grandi@outlook.it>2022-06-27 20:54:40 +0200
committerjacopograndi <jacopo.grandi@outlook.it>2022-06-27 20:54:40 +0200
commit8fbc6aac484e06252ed852ca9222f6c4c6e71b06 (patch)
tree9acb3f7edeeb73c321599471e9ef9412f14eb380
parent1d7de54990c953c9440f0752e84ef6cd21ba0ec3 (diff)
speed
-rw-r--r--src/main.rs71
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);
}