44 lines
1 KiB
Rust
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();
|
|
}
|