spacorium/src/projectile.rs
2025-11-15 16:56:52 +05:00

44 lines
1 KiB
Rust

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<Image>, 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<Collided>,
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();
}