diff --git a/src/main.rs b/src/main.rs index c2487f0..8c24470 100644 --- a/src/main.rs +++ b/src/main.rs @@ -36,6 +36,7 @@ struct Materials { struct SnakeMoveTimer(Timer); +struct GameOverEvent; struct GrowthEvent; #[derive(Default)] @@ -130,6 +131,7 @@ fn spawn_segment( fn snake_movement( keyboard_input: Res>, snake_timer: ResMut, + mut game_over_events: ResMut>, mut last_tail_position: ResMut, segments: ResMut, mut heads: Query<(Entity, &mut SnakeHead)>, @@ -173,6 +175,21 @@ fn snake_movement( head_pos.y -= 1; } }; + + // Check if we've hit 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_events.send(GameOverEvent); + } + + // Check if we've hit our tail + if segment_positions.contains(&head_pos) { + game_over_events.send(GameOverEvent); + } + segment_positions .iter() .zip(segments.0.iter().skip(1)) @@ -183,6 +200,23 @@ fn snake_movement( } } +fn game_over( + commands: &mut Commands, + mut reader: Local>, + game_over_events: Res>, + materials: Res, + segments_res: ResMut, + food: Query>, + segments: Query>, +) { + if reader.iter(&game_over_events).next().is_some() { + for ent in food.iter().chain(segments.iter()) { + commands.despawn(ent); + } + spawn_snake(commands, materials, segments_res); + } +} + fn snake_eating( commands: &mut Commands, snake_timer: ResMut, @@ -284,6 +318,7 @@ fn main() { .add_resource(SnakeSegments::default()) .add_resource(LastTailPosition::default()) .add_event::() + .add_event::() .add_startup_system(setup.system()) .add_startup_stage("game_setup", SystemStage::single(spawn_snake.system())) .add_system(snake_movement.system()) @@ -293,6 +328,7 @@ fn main() { .add_system(snake_timer.system()) .add_system(snake_eating.system()) .add_system(snake_growth.system()) + .add_system(game_over.system()) .add_plugins(DefaultPlugins) .run(); }