aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjacopograndi <jacopo.grandi@outlook.it>2022-07-12 23:56:04 +0200
committerjacopograndi <jacopo.grandi@outlook.it>2022-07-12 23:56:04 +0200
commit3b7b5851f538faffaa5e3fae13b741d28201df63 (patch)
treea1d6ef0b705e10893fc4804ada0760fa9b3408bd
parenta1a4db20568a388216917f128ac0717319222c10 (diff)
goodbye dreamness, welcome yessnes
-rw-r--r--Cargo.lock252
-rw-r--r--Cargo.toml2
-rw-r--r--assets/maps/NAME.txt8
-rw-r--r--src/main.rs370
4 files changed, 370 insertions, 262 deletions
diff --git a/Cargo.lock b/Cargo.lock
index e22e90a..5af2c85 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -601,6 +601,19 @@ dependencies = [
]
[[package]]
+name = "bevy_rapier2d"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7eac8f9d432682b0d865fd382cc65f637b2d1d31b3ca5a05cb0e7f81a7f7eb3"
+dependencies = [
+ "bevy",
+ "bitflags",
+ "log",
+ "nalgebra",
+ "rapier2d",
+]
+
+[[package]]
name = "bevy_reflect"
version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1239,6 +1252,20 @@ dependencies = [
]
[[package]]
+name = "crossbeam"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ae5588f6b3c3cb05239e90bd110f257254aecd01e4635400391aeae07497845"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-epoch",
+ "crossbeam-queue",
+ "crossbeam-utils",
+]
+
+[[package]]
name = "crossbeam-channel"
version = "0.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1249,6 +1276,41 @@ dependencies = [
]
[[package]]
+name = "crossbeam-deque"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07db9d94cbd326813772c968ccd25999e5f8ae22f4f8d1b11effa37ef6ce281d"
+dependencies = [
+ "autocfg",
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+ "memoffset",
+ "once_cell",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-queue"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f25d8400f4a7a5778f0e4e52384a48cbd9b5c495d110786187fc750075277a2"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crossbeam-utils",
+]
+
+[[package]]
name = "crossbeam-utils"
version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1350,6 +1412,12 @@ dependencies = [
]
[[package]]
+name = "either"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f107b87b6afc2a64fd13cac55fe06d6c8859f12d4b14cbcdd2c67d0976781be"
+
+[[package]]
name = "emath"
version = "0.18.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -1769,7 +1837,7 @@ dependencies = [
"byteorder",
"color_quant",
"num-iter",
- "num-rational",
+ "num-rational 0.3.2",
"num-traits",
"png",
"scoped_threadpool",
@@ -1836,6 +1904,7 @@ version = "0.1.0"
dependencies = [
"bevy",
"bevy-inspector-egui",
+ "bevy_rapier2d",
"serde",
"serde_json",
]
@@ -1976,6 +2045,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fc7aa29613bd6a620df431842069224d8bc9011086b1db4c0e0cd47fa03ec9a"
[[package]]
+name = "libm"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33a33a362ce288760ec6a508b94caaec573ae7d3bbbd91b87aa0bad4456839db"
+
+[[package]]
name = "libudev-sys"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2047,6 +2122,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3e378b66a060d48947b590737b30a1be76706c8dd7b8ba0f2fe3989c68a853f"
[[package]]
+name = "matrixmultiply"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "add85d4dd35074e6fedc608f8c8f513a3548619a9024b751949ef0e8e45a4d84"
+dependencies = [
+ "rawpointer",
+]
+
+[[package]]
name = "memchr"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2161,6 +2245,34 @@ dependencies = [
]
[[package]]
+name = "nalgebra"
+version = "0.31.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "18a89248335f688e4bd994e6d030fd7e185eb41769b8c435395075425e100ac6"
+dependencies = [
+ "approx",
+ "glam",
+ "matrixmultiply",
+ "nalgebra-macros",
+ "num-complex",
+ "num-rational 0.4.1",
+ "num-traits",
+ "simba",
+ "typenum",
+]
+
+[[package]]
+name = "nalgebra-macros"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01fcc0b8149b4632adc89ac3b7b31a12fb6099a0317a4eb2ebff574ef7de7218"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
name = "ndk"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2321,6 +2433,15 @@ dependencies = [
]
[[package]]
+name = "num-complex"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ae39348c8bc5fbd7f40c727a9925f03517afd2ab27d46702108b6a7e5414c19"
+dependencies = [
+ "num-traits",
+]
+
+[[package]]
name = "num-derive"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2364,12 +2485,24 @@ dependencies = [
]
[[package]]
+name = "num-rational"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
+dependencies = [
+ "autocfg",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
name = "num-traits"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd"
dependencies = [
"autocfg",
+ "libm 0.2.2",
]
[[package]]
@@ -2481,6 +2614,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225"
[[package]]
+name = "optional"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "978aa494585d3ca4ad74929863093e87cac9790d81fe7aba2b3dc2890643a0fc"
+
+[[package]]
name = "owned_ttf_parser"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2544,6 +2683,33 @@ dependencies = [
]
[[package]]
+name = "parry2d"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2841cebc29aaf7c69058b242742853d9b106c5245ed946090a75d941d23a6f5e"
+dependencies = [
+ "approx",
+ "arrayvec",
+ "bitflags",
+ "downcast-rs",
+ "either",
+ "nalgebra",
+ "num-derive",
+ "num-traits",
+ "rustc-hash",
+ "simba",
+ "slab",
+ "smallvec",
+ "spade",
+]
+
+[[package]]
+name = "paste"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0c520e05135d6e763148b6426a837e239041653ba7becd2e538c076c738025fc"
+
+[[package]]
name = "peeking_take_while"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2681,6 +2847,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63e935c45e09cc6dcf00d2f0b2d630a58f4095320223d47fc68918722f0538b6"
[[package]]
+name = "rapier2d"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "84d7e798266018ec9194a6ca931ae6520c0bf5f7dbdbcb5f1d8bb0d9c075ea24"
+dependencies = [
+ "approx",
+ "arrayvec",
+ "bit-vec",
+ "bitflags",
+ "crossbeam",
+ "downcast-rs",
+ "nalgebra",
+ "num-derive",
+ "num-traits",
+ "parry2d",
+ "rustc-hash",
+ "simba",
+]
+
+[[package]]
name = "raw-window-handle"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2690,6 +2876,12 @@ dependencies = [
]
[[package]]
+name = "rawpointer"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
+
+[[package]]
name = "rectangle-pack"
version = "0.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2737,6 +2929,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1382d1f0a252c4bf97dc20d979a2fdd05b024acd7c2ed0f7595d7817666a157"
[[package]]
+name = "robust"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5864e7ef1a6b7bcf1d6ca3f655e65e724ed3b52546a0d0a663c991522f552ea"
+
+[[package]]
name = "rodio"
version = "0.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2790,6 +2988,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695"
[[package]]
+name = "safe_arch"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "794821e4ccb0d9f979512f9c1973480123f9bd62a90d74ab0f9426fcf8f4a529"
+dependencies = [
+ "bytemuck",
+]
+
+[[package]]
name = "same-file"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2887,6 +3094,19 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3"
[[package]]
+name = "simba"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "13a2609e876d4f77f6ab7ff5254fc39b4f1927ba8e6db3d18be7c32534d3725e"
+dependencies = [
+ "approx",
+ "num-complex",
+ "num-traits",
+ "paste",
+ "wide",
+]
+
+[[package]]
name = "slab"
version = "0.4.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2911,6 +3131,18 @@ dependencies = [
]
[[package]]
+name = "spade"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "333b8c21ebd9a45c5e955f3d7a1f0c4a2214847dd7e8e1abb69f34ec9b88882d"
+dependencies = [
+ "num-traits",
+ "optional",
+ "robust",
+ "smallvec",
+]
+
+[[package]]
name = "spirv"
version = "0.2.0+1.5.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2990,7 +3222,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b0dc6d20ce137f302edf90f9cd3d278866fd7fb139efca6f246161222ad6d87"
dependencies = [
"lazy_static",
- "libm",
+ "libm 0.1.4",
]
[[package]]
@@ -3170,6 +3402,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42d4b50cba812f0f04f0707bb6a0eaa5fae4ae05d90fc2a377998d2f21e77a1c"
[[package]]
+name = "typenum"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
+
+[[package]]
name = "unicode-bidi"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3459,6 +3697,16 @@ dependencies = [
]
[[package]]
+name = "wide"
+version = "0.7.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3aba2d1dac31ac7cae82847ac5b8be822aee8f99a4e100f279605016b185c5f"
+dependencies = [
+ "bytemuck",
+ "safe_arch",
+]
+
+[[package]]
name = "widestring"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index a01103b..89a26df 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -9,5 +9,7 @@ edition = "2021"
bevy = { version = "0.7", features = ["dynamic"] }
bevy-inspector-egui = "0.11.0"
+bevy_rapier2d = "0.15.0"
+
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
diff --git a/assets/maps/NAME.txt b/assets/maps/NAME.txt
index b1d0576..2fa0f20 100644
--- a/assets/maps/NAME.txt
+++ b/assets/maps/NAME.txt
@@ -4,10 +4,10 @@
"name": "name",
"walls": [
[
- -100,
- 50,
- -50,
- 200,
+ -1000,
+ 500,
+ -500,
+ 2000,
1
]
]
diff --git a/src/main.rs b/src/main.rs
index 5cff0f0..1c13386 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -9,248 +9,99 @@ use std::io::BufReader;
use bevy_inspector_egui::Inspectable;
use bevy::{
- prelude::*,
- sprite::{MaterialMesh2dBundle, collide_aabb::collide},
- render::camera::ScalingMode,
- ecs::system::EntityCommands,
- math::Vec3Swizzles,
core::FixedTimestep,
+ prelude::*,
+ render::camera::ScalingMode,
+ sprite::MaterialMesh2dBundle,
+ window::{Window, WindowResized},
};
-use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin};
+use bevy_rapier2d::prelude::*;
+use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin};
fn main() {
App::new()
+ .insert_resource(WindowDescriptor {
+ title: "Tanks!".to_string(),
+ resizable: true,
+ ..Default::default()
+ })
.add_plugins(DefaultPlugins)
.add_startup_system(spawn_camera)
.add_startup_system(setup)
.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"))
- )
+ .add_plugin(RapierPhysicsPlugin::<NoUserData>::pixels_per_meter(100.0))
+ .add_plugin(RapierDebugRenderPlugin::default())
+ .add_system_to_stage(PhysicsStages::Writeback, camera_follow)
+ .add_system(movement)
+ .add_system(window_resized_event)
.run();
}
-fn spawn_camera(mut commands: Commands) {
- let mut camera = OrthographicCameraBundle::new_2d();
- camera.orthographic_projection.scaling_mode = ScalingMode::None;
- camera.transform = Transform::from_xyz(0.0, 0.0, 100.0);
- commands.spawn_bundle(camera);
+fn window_resized_event(
+ mut events: EventReader<WindowResized>,
+ mut window: ResMut<WindowDescriptor>,
+) {
+ for event in events.iter() {
+ window.width = event.width.try_into().unwrap();
+ window.height = event.height.try_into().unwrap();
+ }
}
fn camera_follow(
- player_query: Query<(&Transform, With<Player>)>,
+ player_query: Query<(&Player, &Transform)>,
mut camera_query: Query<&mut Transform, (Without<Player>, With<Camera>)>,
) {
- let (player_transform, _) = player_query.single();
+ let (_, transform) = player_query.single();
let mut camera_transform = camera_query.single_mut();
- camera_transform.translation.x = player_transform.translation.x;
- camera_transform.translation.y = player_transform.translation.y;
+ camera_transform.translation.x = transform.translation.x;
+ camera_transform.translation.y = transform.translation.y;
}
-#[derive(Component, Inspectable)]
-pub struct Player {
- speed: Vec3,
- radius: f32
-}
-
-#[derive(Component, Clone)]
-pub struct Collider {
- speed_mul: f32,
- height: bool,
+fn spawn_camera(mut commands: Commands) {
+ let mut camera = OrthographicCameraBundle::new_2d();
+ camera.orthographic_projection.scaling_mode = ScalingMode::WindowSize;
+ camera.orthographic_projection.scale = 1.0;
+ camera.transform = Transform::from_xyz(0.0, 0.0, 100.0);
+ commands.spawn_bundle(camera);
}
-fn rotate (
-
-) {
-
+#[derive(Component, Inspectable)]
+pub struct Player {
+ speed: f32,
+ radius: f32,
}
-fn wall_collision_check(
- target_player_pos: Vec3,
- wall_query: &Query<(&Transform, &Collider),
- (With<Collider>, Without<Player>)>,
-) -> Option<Collider> {
- for (wall_transform, collider) in wall_query.iter() {
- let collision = collide(
- target_player_pos,
- Vec2::splat(0.03),
- wall_transform.translation,
- wall_transform.scale.xy()
- );
- if collision.is_some() {
- return Some(collider.clone());
+fn movement(mut player_query: Query<(&mut Player, &mut Velocity)>, keyboard: Res<Input<KeyCode>>) {
+ for (player, mut rb_vels) in player_query.iter_mut() {
+ let mut acc = Vec2::new(0.0, 0.0);
+ if keyboard.pressed(KeyCode::W) {
+ acc.y += 1.0;
}
- }
- None
-}
-
-// https://stackoverflow.com/questions/3838329
-fn ccw (a: Vec3, b: Vec3, c: Vec3) -> bool {
- (c.y - a.y) * (b.x - a.x) > (b.y - a.y) * (c.x - a.x)
-}
-
-fn intersect_segment_segment (a: Vec3, b: Vec3, c: Vec3, d: Vec3) -> bool {
- ccw(a, c, d) != ccw(b, c, d) && ccw(a, b, c) != ccw(a, b, d)
-}
-
-fn collision_segment_segment (
- pos: Vec3, vel: Vec3,
- lo: Vec3, hi: Vec3, norm: Vec3
-) -> (Vec3, Vec3) {
- if intersect_segment_segment(pos, pos + vel, lo, hi) {
- let target = pos + vel - lo;
- let tan = (hi - lo).normalize();
- let tv = target.dot(tan) * tan;
- return (lo + tv + norm * 0.0001, Vec3::ZERO)
- }
- (pos, vel)
-}
-
-// https://stackoverflow.com/questions/1073336
-fn intersect_segment_circle (e: Vec3, l: Vec3, c: Vec3, r: f32) -> bool {
- if (e + l - c).length_squared() < r * r { return true }
- if (e - c).length_squared() < r * r { return true }
-
- let d = l;
- let f = e - c;
- let a = d.length_squared();
- let b = 2.0 * f.dot(d);
- let z = f.dot(f) - r * r;
- let delta = b * b - 4.0 * a * z;
- if delta > 0.0 {
- let deltaroot = delta.sqrt();
- let t1 = (-b - deltaroot) / (2.0 * a);
- if t1 >= 0.0 && t1 <= 1.0 { return true }
- let t2 = (-b + deltaroot) / (2.0 * a);
- if t2 >= 0.0 && t2 <= 1.0 { return true }
- }
- false
-}
-
-fn collision_segment_circle (
- pos: Vec3, vel: Vec3,
- center: Vec3, rad: f32
-) -> (Vec3, Vec3) {
- if intersect_segment_circle(pos, vel, center, rad) {
- let out = pos + vel - center;
- let norm = out.normalize();
- let perp = Vec3::new(-out.y, out.x, 0.0).dot(out) * 2.0;
- return (norm * rad * 1.0005 + center, out * perp)
- }
- (pos, vel)
-}
-
-fn movement (
- 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 (mut player, mut transform) = player_query.single_mut();
-
- let mut acc = Vec3::new(0.0, 0.0, 0.0);
- if keyboard.pressed(KeyCode::W) {
- acc.y += 1.0;
- }
- if keyboard.pressed(KeyCode::S) {
- acc.y -= 1.0;
- }
- if keyboard.pressed(KeyCode::A) {
- acc.x -= 1.0;
- }
- if keyboard.pressed(KeyCode::D) {
- acc.x += 1.0;
- }
- if acc.length_squared() > 1.0 { acc = acc.normalize(); }
- acc *= time.delta_seconds();
-
- player.speed += acc * 0.1;
- player.speed *= 0.8;
-
- for (wall_transform, collider) in wall_query.iter() {
- let center = wall_transform.translation;
- let size = wall_transform.scale;
- let (pos, vel) = collision_segment_segment(
- transform.translation, player.speed,
- center + Vec3::new(size.x/2.0 + player.radius, size.y/2.0, 0.0),
- center + Vec3::new(size.x/2.0 + player.radius, -size.y/2.0, 0.0),
- Vec3::new(1.0, 0.0, 0.0)
- );
- let (pos, vel) = collision_segment_segment(
- pos, vel,
- center + Vec3::new(-size.x/2.0 - player.radius, size.y/2.0, 0.0),
- center + Vec3::new(-size.x/2.0 - player.radius, -size.y/2.0, 0.0),
- Vec3::new(-1.0, 0.0, 0.0)
- );
- let (pos, vel) = collision_segment_segment(
- pos, vel,
- center + Vec3::new(size.x/2.0, size.y/2.0 + player.radius, 0.0),
- center + Vec3::new(-size.x/2.0, size.y/2.0 + player.radius, 0.0),
- Vec3::new(0.0, 1.0, 0.0)
- );
- let (pos, vel) = collision_segment_segment(
- pos, vel,
- center + Vec3::new(size.x/2.0, -size.y/2.0 - player.radius, 0.0),
- center + Vec3::new(-size.x/2.0, -size.y/2.0 - player.radius, 0.0),
- Vec3::new(0.0, -1.0, 0.0)
- );
- let (pos, vel) = collision_segment_circle(
- pos, vel,
- center + Vec3::new(size.x/2.0, size.y/2.0, 0.0),
- player.radius
- );
- transform.translation = pos;
- player.speed = vel;
- }
-
- transform.translation += player.speed;
- /*
- let target = transform.translation + player.speed;
- if let Some(collider) = wall_collision_check(target, &wall_query) {
- if !collider.height {
- transform.translation += player.speed
- * collider.speed_mul;
- player.speed *= 0.8;
- } else {
- player.speed *= 0.0;
+ if keyboard.pressed(KeyCode::S) {
+ acc.y -= 1.0;
}
- } else {
- transform.translation = target;
- }*/
-}
-
-fn spawn_rect(
- commands: &mut Commands,
- meshes: &mut ResMut<Assets<Mesh>>,
- materials: &mut ResMut<Assets<ColorMaterial>>,
- color: Color,
- pos: Vec3,
- size: Vec3
-) {
- commands.spawn_bundle(MaterialMesh2dBundle {
- mesh: meshes.add(Mesh::from(shape::Quad::default())).into(),
- transform: Transform {
- translation: pos,
- scale: size,
- ..default()
- },
- material: materials.add(ColorMaterial::from(color)),
- ..default()
- });
+ if keyboard.pressed(KeyCode::A) {
+ acc.x -= 1.0;
+ }
+ if keyboard.pressed(KeyCode::D) {
+ acc.x += 1.0;
+ }
+ if acc.length_squared() > 0.0 {
+ acc /= acc.length();
+ }
+ rb_vels.linvel = acc * player.speed;
+ }
}
#[derive(Deserialize)]
struct Map {
- name: String,
- walls: Vec<Vec<i32>>,
- hives: Vec<i32>,
- lives: Vec<Vec<i32>>
+ name: String,
+ walls: Vec<Vec<i32>>,
+ hives: Vec<i32>,
+ lives: Vec<Vec<i32>>,
}
fn setup_map(
@@ -258,28 +109,25 @@ fn setup_map(
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<ColorMaterial>>,
) {
- let file = File::open("assets/maps/TERM.txt").expect("No map file found");
- let map : Map = serde_json::from_reader(BufReader::new(file)).unwrap();
+ let file = File::open("assets/maps/OFFC.txt").expect("No map file found");
+ let map: Map = serde_json::from_reader(BufReader::new(file)).unwrap();
let minx = map.walls.iter().map(|w| w[0]).min().unwrap() as f32;
let maxx = map.walls.iter().map(|w| w[2]).max().unwrap() as f32;
let miny = map.walls.iter().map(|w| w[1]).min().unwrap() as f32;
let maxy = map.walls.iter().map(|w| w[3]).max().unwrap() as f32;
- let origin = Vec3::new(
- maxx - minx,
- maxy - miny,
- 0.0
- );
+ let origin = Vec3::new(maxx - minx, maxy - miny, 0.0);
for wall in &map.walls {
let upleft = Vec3::new(wall[0] as f32, wall[1] as f32, 0.0);
let downright = Vec3::new(wall[2] as f32, wall[3] as f32, 0.0);
- let center = (upleft + downright - origin) / 2.0 * 0.002;
+ let center = (upleft + downright - origin) / 2.0;
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 });
+ (wall[2] - wall[0] + 3) as f32,
+ (wall[3] - wall[1] + 3) as f32,
+ 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 {
@@ -294,32 +142,27 @@ fn setup_map(
for wall in &map.walls {
let upleft = Vec3::new(wall[0] as f32, wall[1] as f32, 0.0);
let downright = Vec3::new(wall[2] as f32, wall[3] as f32, 0.0);
- let center = (upleft + downright - origin) / 2.0 * 0.002;
- let size = Vec3::new(
- (wall[2] - wall[0]) as f32,
- (wall[3] - wall[1]) as f32, 1.0) * 0.002;
+ let center = (upleft + downright - origin) / 2.0;
+ let size = Vec3::new((wall[2] - wall[0]) as f32, (wall[3] - wall[1]) as f32, 1.0);
let color = match wall[4] {
1 => Color::rgba(0.7, 0.2, 0.0, 1.0),
2 => Color::rgba(0.15, 0.4, 0.03, 1.0),
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: movecenter,
- scale: size,
+ 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: movecenter,
+ scale: size,
+ ..default()
+ },
+ material: materials.add(ColorMaterial::from(color)),
..default()
- },
- material: materials.add(ColorMaterial::from(color)),
- ..default()
- })
- .insert(Collider {
- speed_mul: if wall[4] == 2 { 0.5 } else { 1.0 },
- height: if wall[4] == 2 { false } else { true }
- });
+ })
+ .insert(Collider::cuboid(0.5, 0.5));
}
}
@@ -327,25 +170,40 @@ fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<ColorMaterial>>,
+ mut rapier_config: ResMut<RapierConfiguration>,
) {
- let color = commands.spawn_bundle(MaterialMesh2dBundle {
- mesh: meshes.add(Mesh::from(shape::Quad::default())).into(),
- transform: Transform::default().with_scale(Vec3::splat(1.2)),
- material: materials.add(ColorMaterial::from(Color::BLACK)),
- ..default()
- }).id();
+ rapier_config.gravity = Vec2::ZERO;
+
+ let color = commands
+ .spawn_bundle(MaterialMesh2dBundle {
+ mesh: meshes.add(Mesh::from(shape::Quad::default())).into(),
+ transform: Transform::default().with_scale(Vec3::splat(1.2)),
+ material: materials.add(ColorMaterial::from(Color::BLACK)),
+ ..default()
+ })
+ .id();
- commands.spawn_bundle(MaterialMesh2dBundle {
- mesh: meshes.add(Mesh::from(shape::Quad::default())).into(),
- transform: Transform::default().with_scale(Vec3::splat(0.03)),
- material: materials.add(ColorMaterial::from(Color::WHITE)),
- ..default()
- })
+ commands
+ .spawn_bundle(MaterialMesh2dBundle {
+ mesh: meshes.add(Mesh::from(shape::Quad::default())).into(),
+ transform: Transform::default().with_scale(Vec3::splat(13.0)),
+ material: materials.add(ColorMaterial::from(Color::WHITE)),
+ ..default()
+ })
.push_children(&[color])
- .insert(Player {
- speed: Vec3::new(0.0, 0.0, 0.0),
- radius: 0.015
- });
+ .insert(Player {
+ speed: 300.0,
+ radius: 10.0,
+ })
+ .insert(RigidBody::Dynamic)
+ .insert(Restitution::coefficient(0.0))
+ .insert(Collider::ball(1.0))
+ .insert(LockedAxes::ROTATION_LOCKED)
+ .insert(Damping {
+ linear_damping: 0.8,
+ angular_damping: 1.0,
+ })
+ .insert(Velocity::zero());
setup_map(commands, meshes, materials);
}