Handle player ship destruction... some of it...
Some checks failed
Basic checks / Basic build-and-test supertask (push) Has been cancelled
Some checks failed
Basic checks / Basic build-and-test supertask (push) Has been cancelled
The player will be respawned, their lives decreased, and the board cleared. The UI doesn't update, and the sudden snap to a freshly reset board is quite jarring. The state transition to GameOver stops the game, but there isn't anything else running in that state so it just looks frozen. Basically, there's a ton left to do, but technically I have handled player ship destruction!
This commit is contained in:
@@ -57,6 +57,7 @@ impl Plugin for AsteroidPlugin {
|
|||||||
asteroids::spawn_asteroid.after(asteroids::tick_asteroid_manager),
|
asteroids::spawn_asteroid.after(asteroids::tick_asteroid_manager),
|
||||||
asteroids::split_asteroids,
|
asteroids::split_asteroids,
|
||||||
ship::bullet_impact_listener,
|
ship::bullet_impact_listener,
|
||||||
|
ship::ship_impact_listener,
|
||||||
collision_listener,
|
collision_listener,
|
||||||
// TODO: Remove debug printing
|
// TODO: Remove debug printing
|
||||||
debug_collision_event_printer,
|
debug_collision_event_printer,
|
||||||
|
|||||||
40
src/ship.rs
40
src/ship.rs
@@ -1,6 +1,7 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
AngularVelocity, GameAssets,
|
AngularVelocity, GameAssets, GameState, Lives,
|
||||||
event::BulletDestroy,
|
asteroids::Asteroid,
|
||||||
|
event::{BulletDestroy, ShipDestroy},
|
||||||
physics::{Velocity, Wrapping},
|
physics::{Velocity, Wrapping},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -44,3 +45,38 @@ pub fn bullet_impact_listener(mut commands: Commands, mut events: EventReader<Bu
|
|||||||
commands.entity(event.0).despawn();
|
commands.entity(event.0).despawn();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Watch for [`ShipDestroy`] events and update game state accordingly.
|
||||||
|
///
|
||||||
|
/// - Subtract a life
|
||||||
|
/// - Check life count. If 0, go to game-over state
|
||||||
|
/// - Clear all asteroids
|
||||||
|
/// - Respawn player
|
||||||
|
pub fn ship_impact_listener(
|
||||||
|
mut events: EventReader<ShipDestroy>,
|
||||||
|
mut commands: Commands,
|
||||||
|
mut lives: ResMut<Lives>,
|
||||||
|
rocks: Query<Entity, With<Asteroid>>,
|
||||||
|
mut player: Single<(&mut Transform, &mut Velocity), With<Ship>>,
|
||||||
|
mut next_state: ResMut<NextState<GameState>>,
|
||||||
|
) {
|
||||||
|
for _ in events.read() {
|
||||||
|
// STEP 1: Decrement lives (and maybe go to game over)
|
||||||
|
if lives.0 == 0 {
|
||||||
|
// If already at 0, game is over.
|
||||||
|
next_state.set(GameState::GameOver);
|
||||||
|
} else {
|
||||||
|
// Decrease life count.
|
||||||
|
lives.0 -= 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// STEP 2: Clear asteroids
|
||||||
|
for rock in rocks {
|
||||||
|
commands.entity(rock).despawn();
|
||||||
|
}
|
||||||
|
|
||||||
|
// STEP 3: Respawn player (teleport them to the origin)
|
||||||
|
player.0.translation = Vec3::ZERO;
|
||||||
|
player.1.0 = Vec2::ZERO;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user