Проектная работа - WIP
This commit is contained in:
+17
-20
@@ -23,26 +23,19 @@ pub fn head_rotation(
|
||||
pub fn moving(time: Res<Time>, query: Query<(&mut Transform, &mut Inert, &Direction, &Velocity)>) {
|
||||
for (mut transform, mut inert, direction, Velocity(velocity)) in query.into_iter() {
|
||||
let delta = velocity * time.delta_secs();
|
||||
if inert.0 == *direction {
|
||||
let inert_vec = inert.0.vector();
|
||||
let delta_vec = inert_vec * delta;
|
||||
transform.translation += delta_vec.extend(0.0);
|
||||
} else {
|
||||
let inert_vec = inert.0.vector();
|
||||
let delta_vec = inert_vec * delta;
|
||||
let ovf_vec = vec2(
|
||||
get_overflow(GRID_SIZE as f32, transform.translation.x, delta_vec.x),
|
||||
get_overflow(GRID_SIZE as f32, transform.translation.y, delta_vec.y),
|
||||
);
|
||||
transform.translation += delta_vec.extend(0.0);
|
||||
if ovf_vec.x != 0. && ovf_vec.y != 0. {
|
||||
transform.translation -= ovf_vec.extend(0.0);
|
||||
let delta = ovf_vec.x + ovf_vec.y;
|
||||
let inert_vec = direction.vector();
|
||||
let delta_vec = inert_vec * delta;
|
||||
transform.translation += delta_vec.extend(0.0);
|
||||
}
|
||||
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;
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -86,7 +79,7 @@ fn find_grid_bound(old: f32, new: f32, grid: f32) -> f32 {
|
||||
/// Разбиение изменения координаты по границам сетки
|
||||
fn split_by_grid(src: f32, dst: f32, grid: f32) -> Vec<(f32, f32)> {
|
||||
if grid <= 0.0 {
|
||||
return Vec::default();
|
||||
return vec![(dst, dst - src)];
|
||||
};
|
||||
|
||||
let old_grid = src / grid;
|
||||
@@ -206,5 +199,9 @@ mod test {
|
||||
split_by_grid(-2.0, -6.0, 5.0),
|
||||
vec![(-5.0, -3.0), (-6.0, -1.0)]
|
||||
);
|
||||
|
||||
// сценарии с нулевой сеткой
|
||||
assert_eq!(split_by_grid(1.0, 4.0, 0.0), vec![(4.0, 3.0)]);
|
||||
assert_eq!(split_by_grid(4.0, 1.0, 0.0), vec![(1.0, -3.0)]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user