|
@@ -19,6 +19,7 @@ fn main() {
|
|
|
})
|
|
|
.insert_resource(ClearColor(Color::rgb(0.04, 0.04, 0.04)))
|
|
|
.insert_resource(c::SnakeSegments::default())
|
|
|
+ .insert_resource(c::LastTailPosition::default())
|
|
|
.add_startup_system(setup.system())
|
|
|
.add_startup_stage("game_setup", SystemStage::single(snake::spawn.system()))
|
|
|
.add_plugins(DefaultPlugins)
|
|
@@ -28,6 +29,7 @@ fn main() {
|
|
|
.label(c::SnakeMovement::Input)
|
|
|
.before(c::SnakeMovement::Movement),
|
|
|
)
|
|
|
+ .add_system(game_over.system().after(c::SnakeMovement::Movement))
|
|
|
.add_system_set(
|
|
|
SystemSet::new()
|
|
|
.with_run_criteria(FixedTimestep::step(0.3))
|
|
@@ -37,6 +39,12 @@ fn main() {
|
|
|
.system()
|
|
|
.label(c::SnakeMovement::Eating)
|
|
|
.after(c::SnakeMovement::Movement),
|
|
|
+ )
|
|
|
+ .with_system(
|
|
|
+ snake::growth
|
|
|
+ .system()
|
|
|
+ .label(c::SnakeMovement::Growth)
|
|
|
+ .after(c::SnakeMovement::Eating),
|
|
|
),
|
|
|
)
|
|
|
.add_system_set_to_stage(
|
|
@@ -51,6 +59,7 @@ fn main() {
|
|
|
.with_system(food_spawner.system()),
|
|
|
)
|
|
|
.add_event::<c::GrowthEvent>()
|
|
|
+ .add_event::<c::GameOverEvent>()
|
|
|
.run();
|
|
|
}
|
|
|
|
|
@@ -102,3 +111,19 @@ fn position_translation(windows: Res<Windows>, mut q: Query<(&c::Position, &mut
|
|
|
)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+fn game_over(
|
|
|
+ mut commands: Commands,
|
|
|
+ mut reader: EventReader<c::GameOverEvent>,
|
|
|
+ materials: Res<c::Materials>,
|
|
|
+ segments_res: ResMut<c::SnakeSegments>,
|
|
|
+ food: Query<Entity, With<c::Food>>,
|
|
|
+ segments: Query<Entity, With<c::SnakeSegment>>,
|
|
|
+) {
|
|
|
+ if reader.iter().next().is_some() {
|
|
|
+ for ent in food.iter().chain(segments.iter()) {
|
|
|
+ commands.entity(ent).despawn();
|
|
|
+ }
|
|
|
+ snake::spawn(commands, materials, segments_res);
|
|
|
+ }
|
|
|
+}
|