Death detection
This commit is contained in:
parent
abb0198a2b
commit
5ea5d9e2de
2 changed files with 21 additions and 5 deletions
|
|
@ -1,7 +1,7 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
|
|
||||||
use crate::GameState;
|
use crate::{GameState, ships::Factions};
|
||||||
|
|
||||||
pub struct DamagablePlugin;
|
pub struct DamagablePlugin;
|
||||||
|
|
||||||
|
|
@ -20,6 +20,9 @@ pub struct Damagable {
|
||||||
max_hp: u32,
|
max_hp: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Event)]
|
||||||
|
pub struct DamageableKilled(Option<Factions>);
|
||||||
|
|
||||||
impl Default for Damagable {
|
impl Default for Damagable {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self { max_hp: 15, hp: 15 }
|
Self { max_hp: 15, hp: 15 }
|
||||||
|
|
@ -38,12 +41,24 @@ impl Damagable {
|
||||||
}
|
}
|
||||||
self.hp -= amount;
|
self.hp -= amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn health(&self) -> u32 {
|
||||||
|
return self.hp;
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn max_health(&self) -> u32 {
|
||||||
|
return self.max_hp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn broken_ships_cleanup(mut commands: Commands, query: Query<(Entity, &Damagable)>) {
|
pub fn broken_ships_cleanup(
|
||||||
for (entity, damagable) in query {
|
mut commands: Commands,
|
||||||
|
query: Query<(Entity, &Damagable, Option<&Factions>)>,
|
||||||
|
) {
|
||||||
|
for (entity, damagable, faction) in query {
|
||||||
if damagable.hp == 0 {
|
if damagable.hp == 0 {
|
||||||
commands.get_entity(entity).unwrap().despawn();
|
commands.get_entity(entity).unwrap().despawn();
|
||||||
|
commands.trigger(DamageableKilled(faction.cloned()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ pub fn spawn_enemy(commands: &mut Commands, sprite: Handle<Image>, at: Vec2) {
|
||||||
},
|
},
|
||||||
Gun::new(2, f32::to_radians(15.), 0.2),
|
Gun::new(2, f32::to_radians(15.), 0.2),
|
||||||
Collider::new(8.),
|
Collider::new(8.),
|
||||||
Velocity::moving(256., f32::to_radians(360.)),
|
Velocity::moving(256., f32::to_radians(180.)),
|
||||||
Sprite::from(sprite),
|
Sprite::from(sprite),
|
||||||
Transform::from_xyz(at.x, at.y, 0.),
|
Transform::from_xyz(at.x, at.y, 0.),
|
||||||
Damagable::new(100),
|
Damagable::new(100),
|
||||||
|
|
@ -77,17 +77,18 @@ pub fn enemy_ai_system(
|
||||||
if distance_to_player <= enemy.return_radius * enemy.return_radius {
|
if distance_to_player <= enemy.return_radius * enemy.return_radius {
|
||||||
enemy_velocity.linear_speed = enemy_velocity.max_linear_speed;
|
enemy_velocity.linear_speed = enemy_velocity.max_linear_speed;
|
||||||
enemy.state = EnemyState::Distancing;
|
enemy.state = EnemyState::Distancing;
|
||||||
gun.shoot = false;
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
EnemyState::Distancing => {
|
EnemyState::Distancing => {
|
||||||
if distance_to_player > enemy.return_radius * enemy.return_radius {
|
if distance_to_player > enemy.return_radius * enemy.return_radius {
|
||||||
enemy.state = EnemyState::Approaching;
|
enemy.state = EnemyState::Approaching;
|
||||||
|
gun.shoot = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if direction.angle_between(dir_to_player) > f32::to_radians(90.) {
|
if direction.angle_between(dir_to_player) > f32::to_radians(90.) {
|
||||||
enemy_velocity.rotation_speed = 0.;
|
enemy_velocity.rotation_speed = 0.;
|
||||||
|
gun.shoot = false;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue