Add fruit spawning

This commit is contained in:
2022-08-19 22:09:34 +02:00
parent d1db542b16
commit 7c3855853f
6 changed files with 205 additions and 30 deletions

85
src/fruit.rs Normal file
View File

@@ -0,0 +1,85 @@
use crate::{
grid,
snake::{self, SnakeHead, Z_HEIGHT},
tick::tick_triggered,
};
use bevy::prelude::*;
use iyes_loopless::prelude::*;
use rand::prelude::*;
pub struct FruitPlugin;
impl Plugin for FruitPlugin {
fn build(&self, app: &mut App) {
app.add_event::<EatenEvent>()
.add_startup_system(spawn_fruit_system)
.add_system(
eat_fruit_system
.run_if(tick_triggered)
.before(snake::SystemLabel::SegmentMovement),
)
.add_system(debug_eaten_event_system)
.add_system(despawn_fruit_system)
.add_system(spawn_fruit_system.run_on_event::<EatenEvent>());
}
}
pub struct EatenEvent(Option<Entity>);
#[derive(Component)]
pub struct Fruit;
fn spawn_fruit_system(mut commands: Commands) {
// TODO: not spawn in snake
let mut rng = rand::thread_rng();
let coordinate_range = 0..grid::SIZE;
let fruit_coordinate = grid::Coordinate(
rng.gen_range(coordinate_range.clone()),
rng.gen_range(coordinate_range),
);
commands
.spawn_bundle(SpriteBundle {
sprite: Sprite {
color: Color::GREEN,
custom_size: Some(Vec2::splat(grid::SEGMENT_SIZE) * 0.6),
..Default::default()
},
transform: Transform::from_translation(Vec2::from(fruit_coordinate).extend(Z_HEIGHT)),
..Default::default()
})
.insert(fruit_coordinate)
.insert(Fruit)
.insert(Name::new("Fruit"));
}
fn eat_fruit_system(
snake_head_query: Query<&grid::Coordinate, With<SnakeHead>>,
fruit_query: Query<(Entity, &grid::Coordinate), With<Fruit>>,
mut eaten_event_writer: EventWriter<EatenEvent>,
) {
let &snake_head_coordinate = snake_head_query.single();
for (fruit, &fruit_coordinate) in fruit_query.iter() {
if snake_head_coordinate == fruit_coordinate {
eaten_event_writer.send(EatenEvent(Some(fruit)));
}
}
}
fn despawn_fruit_system(mut commands: Commands, mut event_reader: EventReader<EatenEvent>) {
for &EatenEvent(fruit) in event_reader.iter() {
if let Some(fruit) = fruit {
commands.entity(fruit).despawn();
}
}
}
fn debug_eaten_event_system(
mut event_writer: EventWriter<EatenEvent>,
keypress: Res<Input<KeyCode>>,
) {
if keypress.just_pressed(KeyCode::Space) {
event_writer.send(EatenEvent(None));
}
}