Skip to content

Commit c0344a4

Browse files
committed
Hitting the wall
1 parent 162f159 commit c0344a4

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

src/main.rs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ struct SnakeHead {
3434
direction: Direction,
3535
}
3636

37+
struct GameOverEvent;
3738
struct GrowthEvent;
3839

3940
#[derive(Default)]
@@ -109,6 +110,7 @@ fn spawn_segment(mut commands: Commands, position: Position) -> Entity {
109110

110111
fn 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+
164192
fn 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

Comments
 (0)