From a1180ea7691fe449465ea6e0112d68301b7c2c86 Mon Sep 17 00:00:00 2001 From: nquidox Date: Fri, 17 Apr 2026 16:24:53 +0300 Subject: [PATCH] additional track fields + simplified arc helper --- src/states/linear/components_track.rs | 6 ++++- src/states/linear/systems_track.rs | 37 +++++++++++++++++---------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/states/linear/components_track.rs b/src/states/linear/components_track.rs index a9d286d..58c0a75 100644 --- a/src/states/linear/components_track.rs +++ b/src/states/linear/components_track.rs @@ -27,7 +27,10 @@ pub enum PathSegment { #[derive(Resource)] pub struct PrecalculatedTrack{ - pub segments: Vec + pub segments: Vec, + pub min_spawn_gap: f32, //нормализован + pub total_length: f32, + pub speed_norm: f32, } #[derive(Debug)] @@ -41,6 +44,7 @@ pub struct PTSegment { pub radius: f32, pub start_angle: f32, pub sweep_sign: f32, + pub length: f32, } #[derive(Debug, Clone, Copy)] diff --git a/src/states/linear/systems_track.rs b/src/states/linear/systems_track.rs index c4d7e75..0bedbe9 100644 --- a/src/states/linear/systems_track.rs +++ b/src/states/linear/systems_track.rs @@ -1,7 +1,6 @@ use crate::FACTOR; use crate::states::linear::*; use bevy::prelude::*; -use bevy::reflect::List; use std::f32::consts::FRAC_PI_2; pub fn setup_linear_track() -> Track { @@ -69,7 +68,12 @@ pub fn setup_linear_track() -> Track { } pub fn precalculate_track(track: &Track) -> PrecalculatedTrack { - let mut pt = PrecalculatedTrack { segments: vec![] }; + let mut pt = PrecalculatedTrack { + segments: vec![], + min_spawn_gap: 0.0, + total_length: 0.0, + speed_norm: 0.0, + }; let mut cumulative_length: Vec = vec![0.0]; let mut current_pos = track.start_point; @@ -90,6 +94,7 @@ pub fn precalculate_track(track: &Track) -> PrecalculatedTrack { radius: 0.0, start_angle: 0.0, sweep_sign: 0.0, + length: *length, }; pt.segments.push(calc_seg); @@ -102,6 +107,7 @@ pub fn precalculate_track(track: &Track) -> PrecalculatedTrack { PathSegment::Turn { radius, left } => { let arc = helper_arc_calculator(current_pos, current_dir, *left, *radius); + let arc_len = FRAC_PI_2 * radius; let calc_seg = PTSegment { t_start: 0.0, @@ -113,14 +119,14 @@ pub fn precalculate_track(track: &Track) -> PrecalculatedTrack { radius: *radius, start_angle: arc.start_angle, sweep_sign: arc.sweep_sign, + length: arc_len, }; pt.segments.push(calc_seg); // сдвигаем позицию для следующего сегмента current_pos = arc.end_pos; current_dir = arc.normal; // накапливаем длину - cumulative_length - .push(cumulative_length[cumulative_length.len() - 1] + (FRAC_PI_2 * radius)); + cumulative_length.push(cumulative_length[cumulative_length.len() - 1] + arc_len); } } } @@ -141,30 +147,35 @@ pub fn precalculate_track(track: &Track) -> PrecalculatedTrack { println!("{:?}", seg); } + // считаем нормализованный зазор на треке, когда будет доступен спавн шарика + // pt.min_spawn_gap = STEP / total_length; + pt.min_spawn_gap = STEP / total_length; + pt.total_length = total_length; + pt.speed_norm = STEP / total_length; // нормализованное смещение для скорости в пикселях + + println!( + "Нормализованное значение размера шарика: {}, уе: {}, общая длина: {}", + pt.min_spawn_gap, STEP, total_length + ); pt } pub fn helper_arc_calculator(pos: Vec2, dir: Vec2, turn_to: bool, radius: f32) -> ArcCalculation { let (normal, sign): (Vec2, f32) = if turn_to { - (Vec2::new(-dir.y, dir.x), -1.0) + (Vec2::new(-dir.y, dir.x), 1.0) } else { - (Vec2::new(dir.y, -dir.x), 1.0) + (Vec2::new(dir.y, -dir.x), -1.0) }; let center = pos + normal * radius; let start_vec = pos - center; - let initial_vec = if turn_to { - -start_vec.perp() - } else { - -start_vec - }; - let angle = initial_vec.to_angle(); + let angle = start_vec.to_angle(); ArcCalculation { normal, center, start_angle: angle, sweep_sign: sign, - end_pos: center + normal.perp() * radius * sign, + end_pos: center - normal.perp() * radius * sign, } }