Fix direction and game over systems

This commit is contained in:
2022-08-20 17:42:37 +02:00
parent 7c3855853f
commit 29a5687956
3 changed files with 46 additions and 33 deletions

View File

@@ -20,7 +20,7 @@ impl Plugin for FruitPlugin {
) )
.add_system(debug_eaten_event_system) .add_system(debug_eaten_event_system)
.add_system(despawn_fruit_system) .add_system(despawn_fruit_system)
.add_system(spawn_fruit_system.run_on_event::<EatenEvent>()); .add_system(spawn_fruit_system.run_if(eaten_event_sent));
} }
} }
@@ -29,6 +29,10 @@ pub struct EatenEvent(Option<Entity>);
#[derive(Component)] #[derive(Component)]
pub struct Fruit; pub struct Fruit;
fn eaten_event_sent(mut eaten_event_reader: EventReader<EatenEvent>) -> bool {
eaten_event_reader.iter().count() != 0
}
fn spawn_fruit_system(mut commands: Commands) { fn spawn_fruit_system(mut commands: Commands) {
// TODO: not spawn in snake // TODO: not spawn in snake
let mut rng = rand::thread_rng(); let mut rng = rand::thread_rng();

View File

@@ -3,12 +3,10 @@ use bevy::prelude::*;
use itertools::Itertools; use itertools::Itertools;
use iyes_loopless::prelude::*; use iyes_loopless::prelude::*;
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash, StageLabel)]
#[derive(StageLabel)]
struct MovementStage; struct MovementStage;
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash, SystemLabel)]
#[derive(SystemLabel)]
pub enum SystemLabel { pub enum SystemLabel {
SegmentMovement, SegmentMovement,
} }
@@ -37,11 +35,16 @@ impl Plugin for SnakePlugin {
.run_if(tick_triggered) .run_if(tick_triggered)
.after(SystemLabel::SegmentMovement), .after(SystemLabel::SegmentMovement),
) )
.add_system(
update_direction_system
.run_in_state(AppState::InGame)
.run_if(tick_triggered),
)
.add_system( .add_system(
game_over_system game_over_system
.run_in_state(AppState::InGame) .run_in_state(AppState::InGame)
.run_if(about_to_lose) .run_if(tick_triggered)
.run_if(tick_triggered), .run_if(about_to_lose),
) )
.add_system(add_direction_system.run_in_state(AppState::Begin)) .add_system(add_direction_system.run_in_state(AppState::Begin))
.add_system(change_direction_system.run_in_state(AppState::InGame)) .add_system(change_direction_system.run_in_state(AppState::InGame))
@@ -66,6 +69,9 @@ enum Direction {
Right, Right,
} }
#[derive(Component)]
struct DirectionBuffer(Option<Direction>);
#[derive(Component)] #[derive(Component)]
struct Snake; struct Snake;
@@ -116,7 +122,8 @@ fn setup_snake_system(mut commands: Commands) {
commands commands
.entity(snake_head) .entity(snake_head)
.insert(Name::new("SnakeHead")) .insert(Name::new("SnakeHead"))
.insert(SnakeHead); .insert(SnakeHead)
.insert(DirectionBuffer(None));
commands commands
.spawn() .spawn()
@@ -160,22 +167,33 @@ fn add_tail_system(
} }
} }
fn update_direction_system(
mut query: Query<(&mut Direction, &mut DirectionBuffer), With<SnakeHead>>,
) {
for (mut direction, mut direction_buffer) in query.iter_mut() {
if let Some(new_direction) = direction_buffer.0 {
*direction = new_direction;
direction_buffer.0 = None;
}
}
}
fn change_direction_system( fn change_direction_system(
keypress: Res<Input<KeyCode>>, keypress: Res<Input<KeyCode>>,
mut query: Query<&mut Direction, With<SnakeHead>>, mut query: Query<(&Direction, &mut DirectionBuffer), With<SnakeHead>>,
) { ) {
if let Some(new_direction) = Direction::from_keypress(keypress) { if let Some(new_direction) = Direction::from_keypress(keypress) {
let mut direction = query.single_mut(); let (direction, mut direction_buffer) = query.single_mut();
match (direction.as_ref(), &new_direction) { if let (Direction::Up, Direction::Down)
(Direction::Up, Direction::Down) | (Direction::Down, Direction::Up)
| (Direction::Down, Direction::Up) | (Direction::Left, Direction::Right)
| (Direction::Left, Direction::Right) | (Direction::Right, Direction::Left) = (direction, &new_direction)
| (Direction::Right, Direction::Left) => return, {
_ => {} return;
} }
*direction = new_direction; direction_buffer.0 = Some(new_direction);
} }
} }

View File

@@ -5,8 +5,7 @@ use std::time::Duration;
const TICK_PERIOD: u64 = 125; const TICK_PERIOD: u64 = 125;
#[derive(Debug, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Clone, PartialEq, Eq, Hash, StageLabel)]
#[derive(StageLabel)]
struct FixedTimeStage; struct FixedTimeStage;
pub struct TickPlugin; pub struct TickPlugin;
@@ -16,14 +15,12 @@ impl Plugin for TickPlugin {
let mut fixed_time_system_stage = SystemStage::parallel(); let mut fixed_time_system_stage = SystemStage::parallel();
fixed_time_system_stage.add_system(tick_event_system.run_in_state(AppState::InGame)); fixed_time_system_stage.add_system(tick_event_system.run_in_state(AppState::InGame));
app.add_event::<TickEvent>() app.add_event::<TickEvent>().add_stage_before(
.add_stage_before( CoreStage::Update,
CoreStage::Update, FixedTimeStage,
FixedTimeStage, FixedTimestepStage::new(Duration::from_millis(TICK_PERIOD))
FixedTimestepStage::new(Duration::from_millis(TICK_PERIOD)) .with_stage(fixed_time_system_stage),
.with_stage(fixed_time_system_stage), );
);
// .add_system(print_tick_system);
} }
} }
@@ -36,9 +33,3 @@ fn tick_event_system(mut event_writer: EventWriter<TickEvent>) {
pub fn tick_triggered(mut event_reader: EventReader<TickEvent>) -> bool { pub fn tick_triggered(mut event_reader: EventReader<TickEvent>) -> bool {
event_reader.iter().count() != 0 event_reader.iter().count() != 0
} }
// fn print_tick_system(mut event_reader: EventReader<TickEvent>) {
// for _ in event_reader.iter() {
// println!("Tick");
// }
// }