From a8dc087bc277839fcc40d51701330e6f31a22ccd Mon Sep 17 00:00:00 2001 From: Christian Nieves Date: Mon, 9 Dec 2024 16:56:57 -0600 Subject: [PATCH] game over working --- src/snake/main.rs | 45 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/snake/main.rs b/src/snake/main.rs index 2fc1ad0..e396514 100644 --- a/src/snake/main.rs +++ b/src/snake/main.rs @@ -47,7 +47,7 @@ struct LastTailPosition(Option); #[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, + mut game_over_writer: EventWriter, ) { // 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, + segments_resource: ResMut, + segments: Query>, + head: Query>, + food: Query>, +) { + 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>, mut q: Query<(&Size, &mut Transform)>, @@ -194,15 +227,18 @@ fn spawn_snake(mut commands: Commands, mut segments: ResMut) { }) .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, @@ -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::(); + app.add_event::(); } }