Add fruit spawning
This commit is contained in:
85
src/fruit.rs
Normal file
85
src/fruit.rs
Normal 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));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user