feat: initial enemy
This commit is contained in:
parent
b193254746
commit
c47aede868
49
src/enemy.rs
Normal file
49
src/enemy.rs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
27
src/main.rs
27
src/main.rs
|
@ -13,6 +13,8 @@ mod player;
|
||||||
use crate::player::*;
|
use crate::player::*;
|
||||||
mod ui;
|
mod ui;
|
||||||
use crate::ui::*;
|
use crate::ui::*;
|
||||||
|
mod enemy;
|
||||||
|
use crate::enemy::*;
|
||||||
|
|
||||||
// Version information
|
// Version information
|
||||||
const VERSION: &str = env!("CARGO_PKG_VERSION");
|
const VERSION: &str = env!("CARGO_PKG_VERSION");
|
||||||
|
@ -59,7 +61,7 @@ fn main() {
|
||||||
.add_systems(Startup, (setup, setup_ui))
|
.add_systems(Startup, (setup, setup_ui))
|
||||||
.add_systems(
|
.add_systems(
|
||||||
Update,
|
Update,
|
||||||
(render_ui, movement, camera_follow, player_regen, attack),
|
(render_ui, movement, camera_follow, player_regen, attack, enemy_movement),
|
||||||
)
|
)
|
||||||
.run();
|
.run();
|
||||||
}
|
}
|
||||||
|
@ -90,6 +92,29 @@ fn setup(mut commands: Commands, asset_server: Res<AssetServer>) {
|
||||||
movement_speed: 512.,
|
movement_speed: 512.,
|
||||||
rotation_speed: f32::to_radians(360.),
|
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: 10.,
|
||||||
health_max: 10.,
|
health_max: 10.,
|
||||||
stamina: 10.,
|
stamina: 10.,
|
||||||
|
|
Loading…
Reference in a new issue