@@ -34,6 +34,7 @@ struct SnakeHead {
3434 direction : Direction ,
3535}
3636
37+ struct GameOverEvent ;
3738struct GrowthEvent ;
3839
3940#[ derive( Default ) ]
@@ -109,6 +110,7 @@ fn spawn_segment(mut commands: Commands, position: Position) -> Entity {
109110
110111fn snake_movement (
111112 mut last_tail_position : ResMut < LastTailPosition > ,
113+ mut game_over_writer : EventWriter < GameOverEvent > ,
112114 segments : ResMut < SnakeSegments > ,
113115 mut heads : Query < ( Entity , & SnakeHead ) > ,
114116 mut positions : Query < & mut Position > ,
@@ -133,6 +135,16 @@ fn snake_movement(
133135 head_pos. y -= 1 ;
134136 }
135137 } ;
138+ if head_pos. x < 0
139+ || head_pos. y < 0
140+ || head_pos. x as u32 >= ARENA_WIDTH
141+ || head_pos. y as u32 >= ARENA_HEIGHT
142+ {
143+ game_over_writer. send ( GameOverEvent ) ;
144+ }
145+ if segment_positions. contains ( & head_pos) {
146+ game_over_writer. send ( GameOverEvent ) ;
147+ }
136148 segment_positions
137149 . iter ( )
138150 . zip ( segments. iter ( ) . skip ( 1 ) )
@@ -161,6 +173,22 @@ fn snake_movement_input(keyboard_input: Res<Input<KeyCode>>, mut heads: Query<&m
161173 }
162174 }
163175}
176+
177+ fn game_over (
178+ mut commands : Commands ,
179+ mut reader : EventReader < GameOverEvent > ,
180+ segments_res : ResMut < SnakeSegments > ,
181+ food : Query < Entity , With < Food > > ,
182+ segments : Query < Entity , With < SnakeSegment > > ,
183+ ) {
184+ if reader. iter ( ) . next ( ) . is_some ( ) {
185+ for ent in food. iter ( ) . chain ( segments. iter ( ) ) {
186+ commands. entity ( ent) . despawn ( ) ;
187+ }
188+ spawn_snake ( commands, segments_res) ;
189+ }
190+ }
191+
164192fn snake_eating (
165193 mut commands : Commands ,
166194 mut growth_writer : EventWriter < GrowthEvent > ,
@@ -246,13 +274,15 @@ fn main() {
246274 . insert_resource ( LastTailPosition :: default ( ) )
247275 . add_event :: < GrowthEvent > ( )
248276 . add_system ( snake_movement_input. before ( snake_movement) )
277+ . add_event :: < GameOverEvent > ( )
249278 . add_system_set (
250279 SystemSet :: new ( )
251280 . with_run_criteria ( FixedTimestep :: step ( 0.150 ) )
252281 . with_system ( snake_movement)
253282 . with_system ( snake_eating. after ( snake_movement) )
254283 . with_system ( snake_growth. after ( snake_eating) ) ,
255284 )
285+ . add_system ( game_over. after ( snake_movement) )
256286 . add_system_set (
257287 SystemSet :: new ( )
258288 . with_run_criteria ( FixedTimestep :: step ( 1.0 ) )
0 commit comments