diff --git a/src/states/linear/system_ball.rs b/src/states/linear/system_ball.rs index 597ab82..b74b174 100644 --- a/src/states/linear/system_ball.rs +++ b/src/states/linear/system_ball.rs @@ -1,27 +1,74 @@ -use bevy::asset::ErasedAssetLoader; -use bevy::prelude::*; +use std::f32::consts::FRAC_PI_2; use crate::states::linear::*; - +use bevy::prelude::*; pub fn spawn_round_ball( track: Res, mut commands: Commands, asset_server: Res, + balls: Query<&RoundBall>, ) { - let ball_type = RoundBallType::random_from_4(); - let image: Handle = asset_server.load(ball_type.asset_path()); - - commands.spawn(( - Sprite { - image, - custom_size: Some(Vec2::splat(STEP)), - ..default() - }, - Transform::from_xyz(0.0, 0.0, ROUND_BALL_Z), - RoundBall { - ball_type, - track_progress: 0.0, - }, - LinearStateMarker + // метод all выдаст истину, если все элементы выполняют условие + let spawn_allowed = balls + .iter() + .all(|b| b.track_progress >= track.min_spawn_gap); + + let min_progress = balls + .iter() + .map(|b| b.track_progress) + .reduce(f32::min) + .unwrap_or(1.0); + + if min_progress >= track.min_spawn_gap { + let ball_type = RoundBallType::random_from_4(); + let image: Handle = asset_server.load(ball_type.asset_path()); + + commands.spawn(( + Sprite { + image, + custom_size: Some(Vec2::splat(STEP)), + ..default() + }, + Transform::from_translation((track.segments[0].start_pos).extend(ROUND_BALL_Z)), + RoundBall { + ball_type, + track_progress: 0.0, + }, + LinearStateMarker, )); + } +} + +pub fn move_round_balls( + track: Res, + mut balls: Query<(&mut Transform, &mut RoundBall)>, + time: Res