Projectile damage
This commit is contained in:
parent
f56ae2bc04
commit
4bf62bfe39
6 changed files with 71 additions and 2 deletions
17
src/damagable.rs
Normal file
17
src/damagable.rs
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Component)]
|
||||||
|
pub struct Damagable {
|
||||||
|
hp: u32,
|
||||||
|
max_hp: u32,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Damagable {
|
||||||
|
pub fn new(max_hp: u32) -> Damagable {
|
||||||
|
Damagable { max_hp, hp: max_hp }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn damage(&mut self, amount: u32) {
|
||||||
|
self.hp = u32::clamp(self.hp - amount, 0, self.max_hp)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,7 +5,9 @@ use crate::movable::MovablePlugin;
|
||||||
use crate::ships::ShipsPlugin;
|
use crate::ships::ShipsPlugin;
|
||||||
|
|
||||||
mod collision;
|
mod collision;
|
||||||
|
mod damagable;
|
||||||
mod movable;
|
mod movable;
|
||||||
|
mod projectile;
|
||||||
mod ships;
|
mod ships;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
|
|
||||||
44
src/projectile.rs
Normal file
44
src/projectile.rs
Normal file
|
|
@ -0,0 +1,44 @@
|
||||||
|
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();
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
use crate::{collision::Collider, movable::Movable};
|
use crate::{collision::Collider, damagable::Damagable, movable::Movable};
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
pub struct Enemy;
|
pub struct Enemy;
|
||||||
|
|
@ -12,5 +12,6 @@ pub fn spawn_enemy(commands: &mut Commands, sprite: Handle<Image>, at: Vec2) {
|
||||||
Movable::new(500., f32::to_radians(360.)),
|
Movable::new(500., f32::to_radians(360.)),
|
||||||
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),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
|
use crate::projectile::spawn_projectile;
|
||||||
|
|
||||||
pub mod enemy;
|
pub mod enemy;
|
||||||
pub mod player;
|
pub mod player;
|
||||||
|
|
||||||
|
|
@ -16,9 +18,11 @@ impl Plugin for ShipsPlugin {
|
||||||
fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
fn startup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
||||||
let player_sprite: Handle<Image> = asset_server.load("player.png");
|
let player_sprite: Handle<Image> = asset_server.load("player.png");
|
||||||
let enemy_sprite: Handle<Image> = asset_server.load("enemy.png");
|
let enemy_sprite: Handle<Image> = asset_server.load("enemy.png");
|
||||||
|
let projectile: Handle<Image> = asset_server.load("projectile.png");
|
||||||
|
|
||||||
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(0., 0.));
|
||||||
enemy::spawn_enemy(&mut commands, enemy_sprite.clone(), Vec2::new(100., 100.));
|
enemy::spawn_enemy(&mut commands, enemy_sprite.clone(), Vec2::new(100., 100.));
|
||||||
|
spawn_projectile(&mut commands, projectile, 1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
use crate::{collision::Collider, movable::Movable};
|
use crate::{collision::Collider, damagable::Damagable, movable::Movable};
|
||||||
use bevy::prelude::*;
|
use bevy::prelude::*;
|
||||||
|
|
||||||
#[derive(Component)]
|
#[derive(Component)]
|
||||||
|
|
@ -13,6 +13,7 @@ pub fn spawn_player(commands: &mut Commands, sprite: Handle<Image>, at: Vec2) {
|
||||||
Movable::new(500., f32::to_radians(360.)),
|
Movable::new(500., f32::to_radians(360.)),
|
||||||
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),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue