From f4e9ad51b96bca6a0a28ba1d3df60b3db2c2845d Mon Sep 17 00:00:00 2001 From: Joda Date: Wed, 15 Oct 2025 17:21:48 -0500 Subject: [PATCH] add starry background closes #17 --- assets/sprites/stars/star1.aseprite | Bin 0 -> 384 bytes assets/sprites/stars/star1.png | Bin 0 -> 95 bytes assets/sprites/stars/star2.aseprite | Bin 0 -> 377 bytes assets/sprites/stars/star2.png | Bin 0 -> 96 bytes src/screens/game.rs | 55 ++++++++++++++++++++++++++++ 5 files changed, 55 insertions(+) create mode 100644 assets/sprites/stars/star1.aseprite create mode 100644 assets/sprites/stars/star1.png create mode 100644 assets/sprites/stars/star2.aseprite create mode 100644 assets/sprites/stars/star2.png diff --git a/assets/sprites/stars/star1.aseprite b/assets/sprites/stars/star1.aseprite new file mode 100644 index 0000000000000000000000000000000000000000..79c9a83eb26b10053c73b79323c5fcb29e15f372 GIT binary patch literal 384 zcmZo*WMFu(l#zi02o)HB9EKDiMgTnqMvx$b01(my08Rh(kr`|&Gth!5K+FPihn~2C zg{oDYOG0OxSFU|;p5u#y1uCNIjKNde?K82Arlurv51 zR;Csy7}^3ktO^W3M>8_~XM!nV2P&wTlbqnt@c8-pKj{Y;3r;p3NtBo^VRdYIzr^ni LCm9*U`Yek8UENko literal 0 HcmV?d00001 diff --git a/assets/sprites/stars/star1.png b/assets/sprites/stars/star1.png new file mode 100644 index 0000000000000000000000000000000000000000..117736347ca8cc0bb9ef2f37232bad7b361819b6 GIT binary patch literal 95 zcmeAS@N?(olHy`uVBq!ia0vp^93afW1|*O0@9PFqYMw5RAre!Q6BI;c?CYP|8_n;W sz~&aSOPAMI;vv_CUe%KmxJRR%Rf33J|k^+@U9~ zV4-RiXA{@$-@mJP-{mEDZ%Z2Ms)p&gH5rvIcV2NS;=-+ozS>4r9*%3v!w*a;zP@$J z^Q)UpWYiOMbUM7X_mykko9FoAV1bILx}&UNsfxu?1B3J7Hn-aBYgr+Are!Q6Bbxm)creCpJFGh t$lJ4{#K^$FAVO-E!J_Vod902M4Bir4Ct3w_dx2UQJYD@<);T3K0RRAo7;FFl literal 0 HcmV?d00001 diff --git a/src/screens/game.rs b/src/screens/game.rs index db6a9c5..16a2623 100644 --- a/src/screens/game.rs +++ b/src/screens/game.rs @@ -40,6 +40,7 @@ pub(super) fn plugin(app: &mut App) { spawn_asteroids, update_asteroids, collide_with_asteroid_check, + update_stars, ) .in_set(GameSystems::Environment), ); @@ -74,9 +75,47 @@ fn spawn_game_screen( PIXEL_PERFECT_LAYERS, )); + spawn_default_stars(&mut commands, &asset_server); + time.unpause(); } +fn spawn_default_stars(commands: &mut Commands, asset_server: &Res) { + let star_count = 100; + for _ in 0..star_count { + let x = random_range(-400.0..400.0); + let y = random_range(-220.0..220.0); + let variant = random_range(1..=2); + + let brightness: f32 = random_range(0.6..1.0); + let brightness = brightness * brightness; + + let color = if random_range(0.0..1.0) < 0.5 { + Color::linear_rgb(brightness, brightness * 0.9, brightness * 0.7) // warmer star + } else { + Color::linear_rgb(brightness * 0.8, brightness * 0.9, brightness) // cooler star + }; + + commands.spawn(( + Name::new("Star"), + Star { + speed: random_range(0.5..=2.0), + }, + Sprite { + image: asset_server.load(format!("sprites/stars/star{variant}.png")), + color, + ..default() + }, + Transform { + translation: Vec3::new(x, y, -10.0), + ..default() + }, + DespawnOnExit(Screen::Game), + PIXEL_PERFECT_LAYERS, + )); + } +} + fn despawn_game_screen( mut commands: Commands, player: Query>, @@ -111,6 +150,11 @@ struct Player { #[derive(Component)] struct Projectile; +#[derive(Component)] +struct Star { + pub speed: f32, +} + #[derive(Component)] struct Asteroid { pub speed: f32, @@ -260,6 +304,17 @@ fn update_asteroids( } } +fn update_stars(mut stars: Query<(&mut Transform, &mut Star)>) { + for (mut transform, mut star) in stars.iter_mut() { + transform.translation -= Vec3::Y * star.speed; + if transform.translation.y < -240.0 { + transform.translation.y = 240.0 + random_range(0.0..20.0); + transform.translation.x = random_range(-400.0..400.0); + star.speed = random_range(0.5..=1.5); + } + } +} + fn spawn_asteroid( commands: &mut Commands, asset_server: &Res,