mod lunar; mod setup; mod controllable; use avian2d::prelude::*; use bevy::{prelude::*, winit::WinitSettings}; use controllable::Player; fn main() { println!("Hello, world!"); App::new() .add_plugins(DefaultPlugins) .insert_resource(ClearColor(Color::srgb(0.5, 0.5, 0.9))) .insert_resource(WinitSettings::game()) .add_plugins(PhysicsPlugins::default()) .add_systems( Startup, ( setup::setup_starting_planet, setup::setup_init, lunar::setup_moon ) ) .add_systems( Update, ( update_gravitational_forces, lunar::update_lunar_transform ) ) .run(); } /*enum GameLevel { NearGround, Space, Moon, LunarSurface, }*/ #[derive(Component)] struct StartPlanet { display_name: String, planet_mass_kg: f32, radius: f32, } fn calculate_force_vector( mass_actor: f32, mass_incident: f32, pos_actor: Vec2, pos_incident: Vec2, ) -> Vec2 { let grav_const = 100.0; (grav_const * mass_actor * mass_incident / (pos_actor.distance_squared(pos_incident))) * Vec2 { x: pos_actor.x - pos_incident.x, y: pos_actor.y - pos_incident.y, } .normalize() /*Vec2 { x: pos_actor.x - pos_incident.x, y: pos_actor.y - pos_incident.y, }.normalize() * 50000.0*/ } fn update_gravitational_forces( mut query_planet: Query<(Entity, &StartPlanet, &Transform)>, mut query_object: Query<(Entity, &Player, &mut ExternalForce, &Transform)>, ) { let (_es, ps, ts) = query_planet.single_mut(); let (_ed, player, mut exd, td) = query_object.single_mut(); let f = calculate_force_vector( ps.planet_mass_kg, player.mass_kg, ts.translation.xy(), td.translation.xy(), ); info!("Force: {}, Transform: {}", f, td.translation); exd.apply_force(f); }