game over working

This commit is contained in:
Christian Nieves
2024-12-09 16:56:57 -06:00
parent a97a142401
commit a8dc087bc2

View File

@ -47,7 +47,7 @@ struct LastTailPosition(Option<Position>);
#[derive(Component)]
struct Food;
#[derive(Component, Clone, Copy, Eq, PartialEq)]
#[derive(Component, Clone, Copy, Eq, PartialEq, Debug)]
struct Position {
x: i32,
y: i32,
@ -93,6 +93,7 @@ fn snake_movement(
heads: Query<(Entity, &SnakeHead)>,
mut positions: Query<&mut Position>,
mut last_tail_position: ResMut<LastTailPosition>,
mut game_over_writer: EventWriter<GameOverEvent>,
) {
// Filter positions to just the segments
let segment_positions = segments
@ -109,6 +110,21 @@ fn snake_movement(
Direction::Left => head_pos.x -= 1,
Direction::Right => head_pos.x += 1,
}
// Before we move the tail, check if the head has collided with a wall.
if head_pos.x < 0
|| head_pos.y < 0
|| head_pos.x as u32 >= ARENA_WIDTH
|| head_pos.y as u32 >= ARENA_HEIGHT
{
game_over_writer.send(GameOverEvent);
}
// Before we move the tail, check if the head has collided with the tail.
if segment_positions.contains(&head_pos) {
println!("triggering GAME OVER tail hit {:?}", &head_pos);
game_over_writer.send(GameOverEvent);
}
segment_positions
.iter()
.zip(segments.0.iter().skip(1))
@ -118,6 +134,23 @@ fn snake_movement(
last_tail_position.0 = Some(*segment_positions.last().unwrap());
}
fn game_over(
mut commands: Commands,
mut game_over_reader: EventReader<GameOverEvent>,
segments_resource: ResMut<SnakeSegments>,
segments: Query<Entity, With<SnakeSegment>>,
head: Query<Entity, With<SnakeHead>>,
food: Query<Entity, With<Food>>,
) {
if game_over_reader.read().next().is_some() {
println!("GAME OVER");
for e in food.iter().chain(segments.iter()).chain(head.iter()) {
commands.entity(e).despawn();
}
spawn_snake(commands, segments_resource);
}
}
fn scale_translation(
mut windows: Query<&mut Window, With<PrimaryWindow>>,
mut q: Query<(&Size, &mut Transform)>,
@ -194,15 +227,18 @@ fn spawn_snake(mut commands: Commands, mut segments: ResMut<SnakeSegments>) {
})
.insert(Size::square(1.0))
.insert(Name::new(String::from("Snake Head")))
.insert(Position { x: 5, y: 0 })
.insert(Position { x: 1, y: 0 })
.id(),
spawn_segment(&mut commands, Position { x: 4, y: 0 }),
spawn_segment(&mut commands, Position { x: 0, y: 0 }),
])
}
#[derive(Event)]
struct GrowthEvent;
#[derive(Event)]
struct GameOverEvent;
fn snake_eating(
mut commands: Commands,
mut growth_writer: EventWriter<GrowthEvent>,
@ -248,7 +284,7 @@ impl Plugin for SnakePlugin {
)
.add_systems(
FixedUpdate,
(snake_movement, snake_eating, snake_growth)
(snake_movement, snake_eating, snake_growth, game_over)
.chain()
.run_if(on_timer(Duration::from_millis(500))),
)
@ -260,6 +296,7 @@ impl Plugin for SnakePlugin {
// Events must be added to the app before they can be used
// using the 'add_event' method
app.add_event::<GrowthEvent>();
app.add_event::<GameOverEvent>();
}
}