This commit is contained in:
Rendo 2025-11-15 17:08:38 +05:00
commit 526caf91c7
4 changed files with 29 additions and 11 deletions

View file

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

View file

@ -1,6 +1,6 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::{collision::Collider, damagable::Damagable, movable::Movable}; use crate::{collision::Collider, damagable::Damagable, movable::Movable, ships::Factions};
#[derive(Component)] #[derive(Component)]
pub struct Enemy; pub struct Enemy;
@ -13,5 +13,6 @@ pub fn spawn_enemy(commands: &mut Commands, sprite: Handle<Image>, at: Vec2) {
Sprite::from(sprite), Sprite::from(sprite),
Transform::from_xyz(at.x, at.y, 0.), Transform::from_xyz(at.x, at.y, 0.),
Damagable::new(10), Damagable::new(10),
Factions::EnemyFaction,
)); ));
} }

View file

@ -5,6 +5,12 @@ use crate::projectile::spawn_projectile;
pub mod enemy; pub mod enemy;
pub mod player; pub mod player;
#[derive(Component, PartialEq)]
pub enum Factions {
PlayerFaction,
EnemyFaction,
}
pub struct ShipsPlugin; pub struct ShipsPlugin;
impl Plugin for ShipsPlugin { impl Plugin for ShipsPlugin {
@ -22,7 +28,7 @@ fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
commands.spawn(Camera2d); commands.spawn(Camera2d);
player::spawn_player(&mut commands, player_sprite, Vec2::new(0., 0.)); player::spawn_player(&mut commands, player_sprite, Vec2::new(100., 100.));
enemy::spawn_enemy(&mut commands, enemy_sprite.clone(), Vec2::new(100., 100.)); enemy::spawn_enemy(&mut commands, enemy_sprite.clone(), Vec2::new(0., 0.));
spawn_projectile(&mut commands, projectile, 1); spawn_projectile(&mut commands, projectile, 1, Factions::PlayerFaction);
} }

View file

@ -1,4 +1,4 @@
use crate::{collision::Collider, damagable::Damagable, movable::Movable}; use crate::{collision::Collider, damagable::Damagable, movable::Movable, ships::Factions};
use bevy::prelude::*; use bevy::prelude::*;
#[derive(Component)] #[derive(Component)]
@ -14,6 +14,7 @@ pub fn spawn_player(commands: &mut Commands, sprite: Handle<Image>, at: Vec2) {
Sprite::from(sprite), Sprite::from(sprite),
Transform::from_xyz(at.x, at.y, 0.), Transform::from_xyz(at.x, at.y, 0.),
Damagable::new(10), Damagable::new(10),
Factions::PlayerFaction,
)); ));
} }