mod debug; use debug::DebugPlugin; use serde::Deserialize; use std::fs::File; 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, }; use bevy::diagnostic::{FrameTimeDiagnosticsPlugin, LogDiagnosticsPlugin}; fn main() { App::new() .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")) ) .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 camera_follow( player_query: Query<(&Transform, With)>, mut camera_query: Query<&mut Transform, (Without, With)>, ) { let (player_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; } #[derive(Component, Inspectable)] pub struct Player { speed: Vec3, } #[derive(Component, Clone)] pub struct Collider { speed_mul: f32, height: bool, } 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()); } } None } fn movement ( mut player_query: Query<(&mut Player, &mut Transform)>, wall_query: Query<(&Transform, &Collider), (With, Without)>, keyboard: Res>, time: Res