123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- use crate::components as c;
- use bevy::prelude::*;
- fn spawn_segment(
- mut commands: Commands,
- material: &Handle<ColorMaterial>,
- position: c::Position,
- ) -> Entity {
- commands
- .spawn_bundle(SpriteBundle {
- material: material.clone(),
- ..Default::default()
- })
- .insert(c::SnakeSegment)
- .insert(position)
- .insert(c::GridSize::square(0.65))
- .id()
- }
- pub fn spawn(
- mut commands: Commands,
- materials: Res<c::Materials>,
- mut segments: ResMut<c::SnakeSegments>,
- ) {
- segments.segments = vec![
- commands
- .spawn_bundle(SpriteBundle {
- material: materials.head_material.clone(),
- sprite: Sprite::new(Vec2::new(10.0, 10.0)),
- ..Default::default()
- })
- .insert(c::SnakeHead {
- direction: c::Direction::Up,
- })
- .insert(c::Position { x: 3, y: 3 })
- .insert(c::GridSize::square(0.8))
- .id(),
- spawn_segment(
- commands,
- &materials.segment_material,
- c::Position { x: 3, y: 2 },
- ),
- ]
- }
- pub fn input(keyboard_input: Res<Input<KeyCode>>, mut heads: Query<&mut c::SnakeHead>) {
- if let Some(mut head) = heads.iter_mut().next() {
- let dir = if keyboard_input.pressed(KeyCode::Left) {
- c::Direction::Left
- } else if keyboard_input.pressed(KeyCode::Down) {
- c::Direction::Down
- } else if keyboard_input.pressed(KeyCode::Up) {
- c::Direction::Up
- } else if keyboard_input.pressed(KeyCode::Right) {
- c::Direction::Right
- } else {
- head.direction
- };
- if dir != head.direction.opposite() {
- head.direction = dir;
- }
- }
- }
- pub fn movement(
- segments: ResMut<c::SnakeSegments>,
- mut heads: Query<(Entity, &c::SnakeHead)>,
- mut positions: Query<&mut c::Position>,
- ) {
- if let Some((head_entity, head)) = heads.iter_mut().next() {
- let segment_positions = segments
- .segments
- .iter()
- .map(|e| *positions.get_mut(*e).unwrap())
- .collect::<Vec<c::Position>>();
- let mut head_pos = positions.get_mut(head_entity).unwrap();
- match &head.direction {
- c::Direction::Left => head_pos.x -= 1,
- c::Direction::Right => head_pos.x += 1,
- c::Direction::Up => head_pos.y += 1,
- c::Direction::Down => head_pos.y -= 1,
- }
- segment_positions
- .iter()
- .zip(segments.segments.iter().skip(1))
- .for_each(|(pos, segment)| {
- *positions.get_mut(*segment).unwrap() = *pos;
- });
- }
- }
- pub fn eating(
- mut commands: Commands,
- mut growth_writer: EventWriter<c::GrowthEvent>,
- food_positions: Query<(Entity, &c::Position), With<c::Food>>,
- head_positions: Query<&c::Position, With<c::SnakeHead>>,
- ) {
- for head_pos in head_positions.iter() {
- for (ent, food_pos) in food_positions.iter() {
- if food_pos == head_pos {
- commands.entity(ent).despawn();
- growth_writer.send(c::GrowthEvent);
- }
- }
- }
- }
|