diff --git a/snake-game/src/domain.rs b/snake-game/src/domain.rs index 2ba6f8b..5d887fd 100644 --- a/snake-game/src/domain.rs +++ b/snake-game/src/domain.rs @@ -24,15 +24,12 @@ pub struct End; #[derive(EntityEvent)] pub struct GridBarier { pub entity: Entity, - #[allow(unused)] - pub src_pos: Position, - #[allow(unused)] - pub dst_pos: Position, + pub pos: Position, } impl GridBarier { - pub fn new(entity: Entity, src_pos: Position, dst_pos: Position) -> Self { - Self { entity, src_pos, dst_pos } + pub fn new(entity: Entity, pos: Position) -> Self { + Self { entity, pos } } } diff --git a/snake-game/src/gameplay.rs b/snake-game/src/gameplay.rs index cb11299..d0bbc25 100644 --- a/snake-game/src/gameplay.rs +++ b/snake-game/src/gameplay.rs @@ -29,24 +29,41 @@ pub fn head_rotation(input: Res>, query: Single<(&mut Trans } /// Система движения для всех движущихся сущностей -pub fn moving(time: Res>, query: Query<(&mut Transform, &mut Inert, &Direction, &Velocity, Entity)>, mut commands: Commands) { +pub fn moving(time: Res>, query: Query<(&mut Transform, &mut Inert, Option<&Direction>, &Velocity, Entity)>, mut commands: Commands) { + // для всех сущностей, обладающих позицией, инерцией, направлением (опционально) и скоростью for (mut transform, mut inert, direction, Velocity(velocity), entity) in query.into_iter() { - let src_transftorm = transform.clone(); + // используя скорость и время получаем величину перемещения let delta = velocity * time.delta_secs(); + // используя направление инерции получаем получаем исходное значение изменяемой координаты и знак изменения ('+' или '-') let src = inert.0.get_coord(&transform); let sign = inert.0.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)); inert.0.set_coord(&mut transform, first.0); + // если разбивка содержит дополнительный сегмент то обрабатываем его if let Some(second) = splited.next() { + // из дополнительного сегмента берем величину изменения let delta = second.1.abs(); - inert.0 = *direction; + if let Some(direction) = direction { + inert.0 = *direction; + } else { + todo!("получить обновленное направление инерции из SnakePath") + } let src = inert.0.get_coord(&transform); let sign = inert.0.get_change_sign(); let dst = src + sign * delta; inert.0.set_coord(&mut transform, dst); - commands.trigger(GridBarier::new(entity, (&src_transftorm).into(), transform.into())); + let transform = transform.clone(); + commands.trigger(GridBarier::new(entity, (&transform).into())); + let direction = direction.clone(); + commands.queue(move |world: &mut World| { + let mut snake_path = world.resource_mut::(); + snake_path.push(&transform, direction); + }); } } }