use bevy::prelude::*; use crate::{ collision::{Collided, Collider}, damagable::Damagable, }; #[derive(Component)] pub struct Projectile { damage: u32, } impl Projectile { pub fn new(damage: u32) -> Projectile { Projectile { damage } } } pub fn spawn_projectile(commands: &mut Commands, sprite: Handle, damage: u32) { commands .spawn(( Projectile::new(damage), Sprite::from(sprite), Collider::new(8.), Transform::from_xyz(0., 0., 0.), )) .observe(observe_collision); } pub fn observe_collision( collision: On, mut commands: Commands, projectile_query: Query<&Projectile>, mut collision_query: Query<&mut Damagable>, ) { let Ok(projectile) = projectile_query.get(collision.entity) else { return; }; let Ok(mut collided) = collision_query.get_mut(collision.with) else { return; }; collided.damage(projectile.damage); commands.get_entity(collision.entity).unwrap().despawn(); }