use bevy::prelude::*; use bevy_rapier2d::prelude::*; use serde::{Deserialize, Serialize}; use crate::planet; #[derive(Component, Clone, Copy, Serialize, Deserialize, Debug, PartialEq, Eq, Hash)] pub enum PlanetType { Earth, Moon, Mars, } #[derive(Bundle)] pub struct PlanetBundle { pub planet_type: PlanetType, pub transform: TransformBundle, } pub fn spawn_planets(mut commands: Commands) { info!("Spawning planets"); let earth_pos = Transform::from_xyz(0.0, 0.0, 0.0); commands .spawn(PlanetBundle { planet_type: PlanetType::Earth, transform: TransformBundle::from(earth_pos), }) .insert(Collider::ball(planet!(PlanetType::Earth).size)) .insert(AdditionalMassProperties::Mass( planet!(PlanetType::Earth).mass, )) .insert(ReadMassProperties::default()) .with_children(|children| { children .spawn(Collider::ball(planet!(PlanetType::Earth).size + 0.3)) .insert(ActiveEvents::COLLISION_EVENTS) .insert(Sensor); }) .insert(RigidBody::Fixed); let moon_pos = Transform::from_xyz(50.0, 20.0, 0.0); commands .spawn(PlanetBundle { planet_type: PlanetType::Moon, transform: TransformBundle::from(moon_pos), }) .insert(Collider::ball(planet!(PlanetType::Moon).size)) .insert(AdditionalMassProperties::Mass( planet!(PlanetType::Moon).mass, )) .insert(ReadMassProperties::default()) .with_children(|children| { children .spawn(Collider::ball(planet!(PlanetType::Moon).size + 0.1)) .insert(ActiveEvents::COLLISION_EVENTS) .insert(Sensor); }) .insert(RigidBody::Fixed); let mars_pos = Transform::from_xyz(-50.0, 300.0, 0.0); commands .spawn(PlanetBundle { planet_type: PlanetType::Mars, transform: TransformBundle::from(mars_pos), }) .insert(Collider::ball(planet!(PlanetType::Mars).size)) .insert(AdditionalMassProperties::Mass( planet!(PlanetType::Mars).mass, )) .insert(ReadMassProperties::default()) .with_children(|children| { children .spawn(Collider::ball(planet!(PlanetType::Mars).size + 0.1)) .insert(ActiveEvents::COLLISION_EVENTS) .insert(Sensor); }) .insert(RigidBody::Fixed); }