Проектная работа - WIP
This commit is contained in:
@@ -0,0 +1,74 @@
|
||||
use bevy::prelude::*;
|
||||
|
||||
use crate::{domain::*, tools::split_by_grid};
|
||||
|
||||
/// Общая механика движения
|
||||
fn moving(
|
||||
velocity: &f32,
|
||||
time: &Time<Fixed>,
|
||||
direction: &mut Direction,
|
||||
mut 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 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);
|
||||
|
||||
// вторая часть движения - после границы сетки
|
||||
if let Some(second) = splited.next() {
|
||||
let delta = second.1.abs();
|
||||
let pos = Position::from(&*transform);
|
||||
if let Some(dir) = switch_direction(pos) {
|
||||
trace!("set new direction for {entity} in {pos} --> {dir}");
|
||||
*direction = dir;
|
||||
}
|
||||
let src = direction.get_coord(&*transform);
|
||||
let sign = direction.get_change_sign();
|
||||
let dst = src + sign * delta;
|
||||
direction.set_coord(&mut transform, dst);
|
||||
|
||||
// создать событие прохождения границы сетки
|
||||
commands.entity(entity).trigger(|e| GridBarier::new(e, pos, (&*direction).clone()));
|
||||
}
|
||||
}
|
||||
|
||||
/// Система движения головы змеи
|
||||
pub fn head_moving(
|
||||
query: Query<(&mut Transform, &mut Direction, &Velocity, &Head, Entity)>,
|
||||
time: Res<Time<Fixed>>,
|
||||
mut snake_path: ResMut<SnakePath>,
|
||||
mut commands: Commands,
|
||||
) {
|
||||
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 snake_path = &mut snake_path;
|
||||
let switch_direction = move |pos: Position| {
|
||||
snake_path.insert(pos.clone(), next_dir.clone());
|
||||
Some(next_dir)
|
||||
};
|
||||
moving(velocity, &time, &mut direction, &mut transform, entity, &mut commands, switch_direction);
|
||||
}
|
||||
}
|
||||
|
||||
/// Система движения тела змеи
|
||||
pub fn snake_moving(
|
||||
query: Query<(&mut Transform, &mut Direction, &Velocity, Entity), (With<Tail>, Without<Head>)>,
|
||||
time: Res<Time<Fixed>>,
|
||||
snake_path: Res<SnakePath>,
|
||||
mut commands: Commands,
|
||||
) {
|
||||
let _span = trace_span!("snake_moving").entered();
|
||||
for (mut transform, mut direction, Velocity(velocity), entity) in query.into_iter() {
|
||||
let snake_path = &snake_path;
|
||||
let switch_direction = move |pos: Position| snake_path.get(&pos).cloned();
|
||||
moving(velocity, &time, &mut direction, &mut transform, entity, &mut commands, switch_direction);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user