feat: initial enemy

This commit is contained in:
Muhammad Nauman Raza 2024-05-27 22:48:39 +01:00
parent b193254746
commit c47aede868
No known key found for this signature in database
GPG key ID: B0EF3A98B29ADB1D
2 changed files with 75 additions and 1 deletions

49
src/enemy.rs Normal file
View file

@ -0,0 +1,49 @@
use bevy::prelude::*;
use std::f32::consts::PI;
use crate::player::*;
// Define the player component
#[derive(Component)]
pub struct Enemy {
pub name: String,
pub movement_speed: f32,
pub rotation_speed: f32,
pub health: f32,
pub health_max: f32,
pub stamina: f32,
pub stamina_max: f32,
pub mana: f32,
pub mana_max: f32,
}
// Define the enemy movement system
pub fn enemy_movement(
time: Res<Time>,
mut set: ParamSet<(
Query<&Transform, Without<Enemy>>,
Query<&mut Transform, With<Enemy>>,
)>,
mut enemy_query: Query<&Enemy>,
) {
let enemy = enemy_query.single_mut();
let mut player_translation = Vec3::ZERO;
for player_transform in set.p0().iter_mut() {
player_translation = player_transform.translation;
}
let movement_distance = enemy.movement_speed * time.delta_seconds();
for mut enemy_transform in set.p1().iter_mut() {
let difference = player_translation - enemy_transform.translation;
let angle = difference.y.atan2(difference.x) - PI/2.;
let movement_direction = Quat::from_axis_angle(Vec3::new(0., 0., 1.), angle);
enemy_transform.rotation = movement_direction;
enemy_transform.translation += movement_direction * Vec3::Y * movement_distance;
}
}

View file

@ -13,6 +13,8 @@ mod player;
use crate::player::*;
mod ui;
use crate::ui::*;
mod enemy;
use crate::enemy::*;
// Version information
const VERSION: &str = env!("CARGO_PKG_VERSION");
@ -59,7 +61,7 @@ fn main() {
.add_systems(Startup, (setup, setup_ui))
.add_systems(
Update,
(render_ui, movement, camera_follow, player_regen, attack),
(render_ui, movement, camera_follow, player_regen, attack, enemy_movement),
)
.run();
}
@ -90,6 +92,29 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
movement_speed: 512.,
rotation_speed: f32::to_radians(360.),
health: 10.,
health_max: 10.,
stamina: 10.,
stamina_max: 10.,
mana: 100.,
mana_max: 100.,
});
// Spawn an enemy
commands
.spawn(SpriteBundle {
texture: asset_server.load("player/player-4x.png"),
transform: Transform {
scale: Vec3::splat(0.2),
..default()
},
..default()
})
.insert(Enemy {
name: "Goblin".to_string(),
movement_speed: 256.,
rotation_speed: f32::to_radians(360.),
health: 10.,
health_max: 10.,
stamina: 10.,