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

This commit is contained in:
11 changed files with 82 additions and 31 deletions
+44 -9
View File
@@ -1,4 +1,7 @@
use bevy::prelude::*;
use std::collections::HashSet;
use bevy::{color::palettes::tailwind::*, prelude::*};
use rand::RngExt;
use crate::{domain::*, tools::split_by_grid};
@@ -7,19 +10,19 @@ fn moving(
velocity: &f32,
time: &Time<Fixed>,
direction: &mut Direction,
mut transform: &mut Transform,
transform: &mut Transform,
entity: Entity,
commands: &mut Commands,
switch_direction: impl FnOnce(Position) -> Option<Direction>,
) {
// первая часть движения - до границы сетки
let delta = velocity * time.delta_secs();
let src = direction.get_coord(&transform);
let src = direction.get_coord(transform);
let sign = direction.get_change_sign();
let dst = src + sign * delta;
let mut splited = split_by_grid(src, dst, GRID_SIZE as f32).into_iter();
let first = splited.next().unwrap_or((0.0, 0.0));
direction.set_coord(&mut transform, first.0);
direction.set_coord(transform, first.0);
// вторая часть движения - после границы сетки
if let Some(second) = splited.next() {
@@ -32,10 +35,10 @@ fn moving(
let src = direction.get_coord(&*transform);
let sign = direction.get_change_sign();
let dst = src + sign * delta;
direction.set_coord(&mut transform, dst);
direction.set_coord(transform, dst);
// создать событие прохождения границы сетки
commands.entity(entity).trigger(|e| GridBarier::new(e, pos, (&*direction).clone()));
commands.entity(entity).trigger(|e| GridBarier::new(e, pos, *direction));
}
}
@@ -48,12 +51,12 @@ pub fn head_moving(
) {
let _span = trace_span!("head_moving").entered();
for (mut transform, mut direction, Velocity(velocity), head, entity) in query.into_iter() {
let next_dir = head.0.clone();
let dir = direction.clone();
let next_dir = head.0;
let dir = *direction;
let snake_path = &mut snake_path;
let switch_direction = move |pos: Position| {
if next_dir != dir {
snake_path.insert(pos.clone(), next_dir.clone());
snake_path.insert(pos, next_dir);
Some(next_dir)
} else {
None
@@ -63,6 +66,7 @@ pub fn head_moving(
}
}
#[allow(clippy::type_complexity)]
/// Система движения тела змеи
pub fn snake_moving(
query: Query<(&mut Transform, &mut Direction, &Velocity, Entity), (With<Tail>, Without<Head>)>,
@@ -77,3 +81,34 @@ pub fn snake_moving(
moving(velocity, &time, &mut direction, &mut transform, entity, &mut commands, switch_direction);
}
}
/// Система спавна еды при необходимости
pub fn spawn_meal_if_needed(
time: Res<Time<Fixed>>, //
mut meal_timer: ResMut<MealRespawnTimer>,
query: Query<&Transform, With<Meal>>,
mut commands: Commands,
) {
if meal_timer.tick(time.elapsed()).just_finished() && query.count() < MAX_MEALS_ON_FIELD as usize {
let used_positions = query.iter().map(Position::from).collect::<HashSet<Position>>();
let mut rng = rand::rng();
let pos = loop {
const ABS: i8 = (FIELD_SIZE as f32 / 2.0) as i8;
let rand_x = rng.random::<i8>() % ABS;
let rand_y = rng.random::<i8>() % ABS;
let rand_pos = Position::new(rand_x, rand_y);
if !used_positions.contains(&rand_pos) {
break rand_pos;
}
};
commands.spawn((
Meal,
Sprite::from_color(YELLOW_400, vec2(MEAL_SIZE as f32, MEAL_SIZE as f32)), //
Transform {
translation: pos.translation().extend(0.0),
..Default::default()
},
));
trace!("new meal spawned at {pos}");
}
}