Проектная работа - WIP

This commit is contained in:
7 changed files with 50 additions and 7 deletions
+1 -1
View File
@@ -23,7 +23,7 @@ pub struct Head(pub Direction);
/// Сегмент змеиного хвоста
#[derive(Component)]
pub struct Tail;
pub struct Tail(pub Entity);
/// Конец змеиного хвоста
#[derive(Component)]
+2 -1
View File
@@ -22,5 +22,6 @@ pub struct GrowUp;
#[derive(Event, Debug)]
pub enum Collision {
Bounds,
Entity(Entity),
Tail,
Meal,
}
+21
View File
@@ -119,3 +119,24 @@ pub fn check_bounds_colisions(head: Single<(&Transform,), (With<Head>,)>, mut co
commands.trigger(Collision::Bounds);
};
}
/// Система отслеживания столкновений c хвостом
pub fn check_tail_colisions(
head: Single<(&Transform, Entity), (With<Head>,)>,
query: Query<(&Transform, &Velocity, &Tail)>,
mut commands: Commands, //
) {
let (head_transform, head_entity) = head.into_inner();
for (tail_transform, velocity, tail) in query.into_iter() {
if velocity.0 == 0.0 || tail.0 == head_entity {
continue;
}
let distance = head_transform.translation.distance(tail_transform.translation);
if distance < GRID_SIZE as f32 {
commands.trigger(Collision::Tail);
}
}
}
/// Система отслеживания столкновений с едой
pub fn check_meal_collisions() {}
+1 -1
View File
@@ -5,6 +5,6 @@ mod observers;
mod startup;
mod tools;
pub use gameplay::{check_bounds_colisions, head_moving, head_rotation, snake_moving};
pub use gameplay::{check_bounds_colisions, check_meal_collisions, check_tail_colisions, head_moving, head_rotation, snake_moving};
pub use startup::{setup_window, startup};
pub use tools::define_log_layer;
+3 -1
View File
@@ -1,5 +1,5 @@
use bevy::prelude::*;
use snake_game::{check_bounds_colisions, head_moving, head_rotation, setup_window, snake_moving, startup};
use snake_game::{check_bounds_colisions, check_meal_collisions, check_tail_colisions, head_moving, head_rotation, setup_window, snake_moving, startup};
fn main() {
App::new()
@@ -47,6 +47,8 @@ fn main() {
(
|| {}, //
check_bounds_colisions,
check_tail_colisions,
check_meal_collisions,
snake_game::debug::print_all_entities_by_press_enter,
snake_game::debug::time_speed,
),
+20 -2
View File
@@ -1,6 +1,6 @@
use crate::domain::*;
use bevy::prelude::*;
use bevy::{color::palettes::tailwind::*, prelude::*};
/// Запланировать установку скорости движения [Velocity] при следующем событии [GridBarier]
pub fn schedule_set_velocity(tail: Entity) -> impl Fn(On<GridBarier>, Commands, Query<(&mut Velocity, &Transform)>) {
@@ -29,7 +29,7 @@ pub fn grow_up_snake(_: On<GrowUp>, mut commands: Commands, query: Single<(Entit
let pos = Position::from(transform);
let new_end = commands
.spawn((
Tail,
Tail(entity),
End,
direction.clone(),
Velocity(0.0),
@@ -42,3 +42,21 @@ pub fn grow_up_snake(_: On<GrowUp>, mut commands: Commands, query: Single<(Entit
.id();
commands.entity(entity).observe(schedule_set_velocity(new_end));
}
/// Обработка столкновений
pub fn handle_collisions(
event: On<Collision>, //
query: Query<(&mut Velocity, &mut Sprite), Or<(With<Head>, With<Tail>, With<End>)>>,
) {
match event.event() {
Collision::Meal => {
todo!()
}
Collision::Bounds | Collision::Tail => {
for (mut velocity, mut sprite) in query.into_iter() {
velocity.0 = 0.0;
sprite.color = RED_300.into();
}
}
}
}
+2 -1
View File
@@ -68,6 +68,7 @@ fn spawn_snake(commands: &mut Commands) {
use crate::domain::{Direction, HEAD_SIZE, Head, SNAKE_VELOCITY, Velocity};
commands.spawn(Observer::new(crate::debug::trace_snake_moving));
commands.spawn(Observer::new(crate::observers::handle_collisions));
let head = commands
.spawn((
@@ -100,7 +101,7 @@ fn spawn_snake(commands: &mut Commands) {
let tail = commands
.spawn((
Tail,
Tail(head),
End,
Direction::default(),
Velocity(0.0),