use crate::config::planet::{Planet, SpecialSpriteProperties}; use bevy::prelude::*; use bevy_rapier2d::prelude::AdditionalMassProperties; pub fn incoming_planets_plugin(app: &mut App) { app.add_systems(Update, (handle_incoming_planets, handle_updated_planets)); } fn handle_incoming_planets( mut commands: Commands, new_planets: Query<(Entity, &Planet), Added>, asset_server: Res, mut meshes: ResMut>, mut materials: ResMut> ) { for (new_entity, new_planet) in new_planets.iter() { let mut sprite = Sprite::from_image(asset_server.load(&new_planet.sprite)); sprite.custom_size = Some(Vec2::new(new_planet.radius * 2.0, new_planet.radius * 2.0)); match new_planet.special_sprite_properties { Some(SpecialSpriteProperties::ForceColor(c)) => { sprite.color = c; }, _ => {} } let mut commands = commands .entity(new_entity); commands.insert(AdditionalMassProperties::Mass(new_planet.mass)) .insert(sprite); info!(?new_planet, "prepared new planet"); } } fn handle_updated_planets( mut commands: Commands, updated_planets: Query<(Entity, &Planet), Changed>, asset_server: Res, mut meshes: ResMut>, mut materials: ResMut> ) { for (updated_entity, updated_planet) in updated_planets.iter() { let mut sprite = Sprite::from_image(asset_server.load(&updated_planet.sprite)); sprite.custom_size = Some(Vec2::new( updated_planet.radius * 2.0, updated_planet.radius * 2.0, )); match updated_planet.special_sprite_properties { Some(SpecialSpriteProperties::ForceColor(c)) => { sprite.color = c; }, _ => {} } let mut commands = commands.entity(updated_entity); commands.remove::() .insert(AdditionalMassProperties::Mass(updated_planet.mass)) .remove::() .insert(sprite); info!(?updated_planet, "updated planet"); } }