Fix direction and game over systems
This commit is contained in:
@@ -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();
|
||||||
|
|||||||
50
src/snake.rs
50
src/snake.rs
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
23
src/tick.rs
23
src/tick.rs
@@ -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");
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|||||||
Reference in New Issue
Block a user