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

This commit is contained in:
2 changed files with 24 additions and 10 deletions
+3 -6
View File
@@ -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 }
}
}
+20 -3
View File
@@ -29,24 +29,41 @@ pub fn head_rotation(input: Res<ButtonInput<KeyCode>>, query: Single<(&mut Trans
}
/// Система движения для всех движущихся сущностей
pub fn moving(time: Res<Time<Fixed>>, query: Query<(&mut Transform, &mut Inert, &Direction, &Velocity, Entity)>, mut commands: Commands) {
pub fn moving(time: Res<Time<Fixed>>, 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();
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::<SnakePath>();
snake_path.push(&transform, direction);
});
}
}
}