feat: Enhance enemy attack dive mechanics with swooping movement towards the center

This commit is contained in:
Harald Hoyer 2025-04-05 12:53:14 +02:00
parent 45482f9e11
commit 6acfee2f95
2 changed files with 25 additions and 3 deletions

View file

@ -65,7 +65,7 @@ nix develop --command bash -c "cargo build"
* **Enemy Attack Dives:**
* ~~Give enemies an `Attacking` state/component.~~ **(DONE)**
* ~~Periodically trigger enemies in the formation to switch to the `Attacking` state.~~ **(DONE - Random selection after formation complete)**
* Define attack paths (swooping dives towards the player area). **(Basic downward dive implemented)**
* ~~Define attack paths (swooping dives towards the player area).~~ **(DONE - Basic swoop towards center implemented)**
* ~~Make enemies fire bullets (downwards or towards the player) during their dives.~~ **(DONE - Downward)**
* After an attack dive, enemies could return to their formation position or fly off-screen. **(Fly off-screen implemented)**
* **Enemy Variety:**

View file

@ -714,8 +714,30 @@ fn move_enemies(
for (entity, mut transform, state) in attacking_query.iter_mut() { // Get state from query
// *** Explicitly check if the enemy is actually in the Attacking state ***
if *state == EnemyState::Attacking {
// Move straight down ONLY if attacking
transform.translation.y -= attack_speed * time.delta_seconds();
// --- Swooping Dive Logic ---
let delta_seconds = time.delta_seconds();
let vertical_movement = attack_speed * delta_seconds;
// Horizontal movement: Move towards the center (x=0)
let horizontal_speed_factor = 0.5; // Adjust this to control the swoop intensity
let horizontal_movement = if transform.translation.x < 0.0 {
attack_speed * horizontal_speed_factor * delta_seconds
} else if transform.translation.x > 0.0 {
-attack_speed * horizontal_speed_factor * delta_seconds
} else {
0.0 // No horizontal movement if exactly at center
};
// Apply movement
transform.translation.y -= vertical_movement;
transform.translation.x += horizontal_movement;
// Ensure enemy doesn't overshoot the center horizontally if moving towards it
if (transform.translation.x - horizontal_movement < 0.0 && transform.translation.x > 0.0)
|| (transform.translation.x - horizontal_movement > 0.0 && transform.translation.x < 0.0)
{
transform.translation.x = 0.0;
}
}
// Enemies that are InFormation but Without<FormationTarget> will now be ignored by this movement logic.