From 3b7b5851f538faffaa5e3fae13b741d28201df63 Mon Sep 17 00:00:00 2001 From: jacopograndi Date: Tue, 12 Jul 2022 23:56:04 +0200 Subject: goodbye dreamness, welcome yessnes --- src/main.rs | 370 +++++++++++++++++++----------------------------------------- 1 file changed, 114 insertions(+), 256 deletions(-) (limited to 'src') 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::::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, + mut window: ResMut, +) { + 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_query: Query<(&Player, &Transform)>, mut camera_query: Query<&mut Transform, (Without, With)>, ) { - 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, Without)>, -) -> Option { - 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>) { + 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, Without)>, - keyboard: Res>, - time: Res