game over working
This commit is contained in:
@ -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>();
|
||||
}
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user