Skip to content

Commit

Permalink
feat: Redeploy enemies when too far away from player
Browse files Browse the repository at this point in the history
  • Loading branch information
PraxTube committed Jan 3, 2024
1 parent cf01221 commit f91ccbf
Show file tree
Hide file tree
Showing 3 changed files with 38 additions and 9 deletions.
9 changes: 5 additions & 4 deletions src/enemy/archer/spawn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,13 @@ use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
use bevy_trickfilm::prelude::*;

use crate::{player::Player, utils::quat_from_vec2, world::camera::YSort, GameAssets, GameState};
use crate::{
enemy::spawn::SPAWN_OFFSET, player::Player, utils::quat_from_vec2, world::camera::YSort,
GameAssets, GameState,
};

use super::{ArcherState, Enemy, EnemyArcher};

const OFFSET: f32 = 1000.0;

#[derive(Resource)]
struct EnemySpawnCooldown {
timer: Timer,
Expand Down Expand Up @@ -40,7 +41,7 @@ fn spawn_enemies(
.repeat();

let pos = player_transform.translation
+ Quat::from_rotation_z(rng.gen_range(0.0..TAU)).mul_vec3(Vec3::X) * OFFSET;
+ Quat::from_rotation_z(rng.gen_range(0.0..TAU)).mul_vec3(Vec3::X) * SPAWN_OFFSET;

let collider = commands
.spawn((
Expand Down
8 changes: 4 additions & 4 deletions src/enemy/bat/spawn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,12 @@ use bevy::prelude::*;
use bevy_rapier2d::prelude::*;
use bevy_trickfilm::prelude::*;

use crate::{player::Player, world::camera::YSort, GameAssets, GameState};
use crate::{
enemy::spawn::SPAWN_OFFSET, player::Player, world::camera::YSort, GameAssets, GameState,
};

use super::{Enemy, EnemyBat};

const OFFSET: f32 = 500.0;

#[derive(Resource)]
struct EnemySpawnCooldown {
timer: Timer,
Expand Down Expand Up @@ -40,7 +40,7 @@ fn spawn_enemies(
.repeat();

let pos = player_transform.translation
+ Quat::from_rotation_z(rng.gen_range(0.0..TAU)).mul_vec3(Vec3::X) * OFFSET;
+ Quat::from_rotation_z(rng.gen_range(0.0..TAU)).mul_vec3(Vec3::X) * SPAWN_OFFSET;

let collider = commands
.spawn((
Expand Down
30 changes: 29 additions & 1 deletion src/enemy/spawn.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ use crate::{player::Player, GameState};

use super::{Enemy, EnemyProjectile};

pub const SPAWN_OFFSET: f32 = 900.0;
const MAX_PLAYER_DISTANCE: f32 = 1200.0;

#[derive(Event)]
pub struct DespawnEnemy {
pub pos: Vec2,
Expand Down Expand Up @@ -58,14 +61,39 @@ fn adjust_sprite_flip(
}
}

fn redeploy_enemies(
q_player: Query<&Transform, With<Player>>,
mut q_enemies: Query<&mut Transform, (With<Enemy>, Without<Player>)>,
) {
let player_transform = match q_player.get_single() {
Ok(r) => r,
Err(_) => return,
};

for mut enemy_transform in &mut q_enemies {
if enemy_transform
.translation
.truncate()
.distance_squared(player_transform.translation.truncate())
>= MAX_PLAYER_DISTANCE.powi(2)
{
let dir = (player_transform.translation - enemy_transform.translation)
.truncate()
.normalize_or_zero();
enemy_transform.translation =
player_transform.translation + dir.extend(0.0) * SPAWN_OFFSET;
}
}
}

pub struct EnemySpawnPlugin;

impl Plugin for EnemySpawnPlugin {
fn build(&self, app: &mut App) {
app.add_event::<DespawnEnemy>()
.add_systems(
Update,
(adjust_sprite_flip,).run_if(in_state(GameState::Gaming)),
(adjust_sprite_flip, redeploy_enemies).run_if(in_state(GameState::Gaming)),
)
.add_systems(Update, (despawn_enemies, despawn_projectiles))
.add_systems(
Expand Down

0 comments on commit f91ccbf

Please sign in to comment.