diff options
author | jacopograndi <jacopo.grandi@outlook.it> | 2022-07-12 23:56:04 +0200 |
---|---|---|
committer | jacopograndi <jacopo.grandi@outlook.it> | 2022-07-12 23:56:04 +0200 |
commit | 3b7b5851f538faffaa5e3fae13b741d28201df63 (patch) | |
tree | a1d6ef0b705e10893fc4804ada0760fa9b3408bd | |
parent | a1a4db20568a388216917f128ac0717319222c10 (diff) |
goodbye dreamness, welcome yessnes
-rw-r--r-- | Cargo.lock | 252 | ||||
-rw-r--r-- | Cargo.toml | 2 | ||||
-rw-r--r-- | assets/maps/NAME.txt | 8 | ||||
-rw-r--r-- | src/main.rs | 370 |
4 files changed, 370 insertions, 262 deletions
@@ -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" @@ -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); } |