@@ 25,6 25,9 @@ pub const BACK_STARFIELD_SIZE: f32 = 256.0;
pub const MID_STARFIELD_SIZE: f32 = 384.0;
pub const FRONT_STARFIELD_SIZE: f32 = 512.0;
+#[derive(Component, Clone, Copy, Debug)]
+pub struct StarfieldSize(pub f32);
+
pub fn starfield_plugin(app: &mut App) {
app.add_systems(Startup, set_up_starfield)
.add_systems(Update, fix_starfield)
@@ 86,7 89,7 @@ pub fn set_up_starfield(
pub fn fix_starfield(
mut starfield_back: Query<
- &mut Sprite,
+ (Entity, &mut Sprite),
(
With<StarfieldBack>,
Without<StarfieldMid>,
@@ 94,7 97,7 @@ pub fn fix_starfield(
),
>,
mut starfield_mid: Query<
- &mut Sprite,
+ (Entity, &mut Sprite),
(
With<StarfieldMid>,
Without<StarfieldBack>,
@@ 102,7 105,7 @@ pub fn fix_starfield(
),
>,
mut starfield_front: Query<
- &mut Sprite,
+ (Entity, &mut Sprite),
(
With<StarfieldFront>,
Without<StarfieldBack>,
@@ 111,35 114,42 @@ pub fn fix_starfield(
>,
assets: Res<Assets<Image>>,
mut asset_events: MessageReader<AssetEvent<Image>>,
+ mut commands: Commands,
) {
for event in asset_events.read() {
if let AssetEvent::Added { id } = event {
- let mut starfield_back = starfield_back.single_mut().unwrap();
+ let (entity_back, mut starfield_back) = starfield_back.single_mut().unwrap();
if *id == starfield_back.image.id() {
let starfield_image = assets.get(*id).unwrap();
+ let size = BACK_STARFIELD_SIZE / (starfield_image.size().x as f32);
starfield_back.image_mode = SpriteImageMode::Tiled {
tile_x: true,
tile_y: true,
- stretch_value: BACK_STARFIELD_SIZE / (starfield_image.size().x as f32),
+ stretch_value: size,
};
+ commands.entity(entity_back).insert(StarfieldSize(size));
}
- let mut starfield_mid = starfield_mid.single_mut().unwrap();
+ let (entity_mid, mut starfield_mid) = starfield_mid.single_mut().unwrap();
if *id == starfield_mid.image.id() {
let starfield_image = assets.get(*id).unwrap();
+ let size = MID_STARFIELD_SIZE / (starfield_image.size().x as f32);
starfield_mid.image_mode = SpriteImageMode::Tiled {
tile_x: true,
tile_y: true,
- stretch_value: MID_STARFIELD_SIZE / (starfield_image.size().x as f32),
+ stretch_value: size,
};
+ commands.entity(entity_mid).insert(StarfieldSize(size));
}
- let mut starfield_front = starfield_front.single_mut().unwrap();
+ let (entity_front, mut starfield_front) = starfield_front.single_mut().unwrap();
if *id == starfield_front.image.id() {
let starfield_image = assets.get(*id).unwrap();
+ let size = FRONT_STARFIELD_SIZE / (starfield_image.size().x as f32);
starfield_front.image_mode = SpriteImageMode::Tiled {
tile_x: true,
tile_y: true,
- stretch_value: FRONT_STARFIELD_SIZE / (starfield_image.size().x as f32),
+ stretch_value: size,
};
+ commands.entity(entity_front).insert(StarfieldSize(size));
}
}
}
@@ 4,11 4,7 @@ use bevy::{
};
use crate::{
- ecs::Me,
- client::{
- starfield::{BACK_STARFIELD_SIZE, FRONT_STARFIELD_SIZE, MID_STARFIELD_SIZE},
- },
- ecs::{MainCamera, StarfieldBack, StarfieldFront, StarfieldMid},
+ client::starfield::{BACK_STARFIELD_SIZE, FRONT_STARFIELD_SIZE, MID_STARFIELD_SIZE, StarfieldSize}, ecs::{MainCamera, Me, StarfieldBack, StarfieldFront, StarfieldMid}
};
pub fn zoom_plugin(app: &mut App) {
@@ 19,7 15,7 @@ fn on_scroll(
mut scroll_events: MessageReader<MouseWheel>,
window: Single<&Window>,
starfield_back: Single<
- (&mut Sprite, &mut Transform, &mut Visibility),
+ (&mut Sprite, &mut Transform, &mut Visibility, Option<&StarfieldSize>),
(
With<StarfieldBack>,
Without<StarfieldMid>,
@@ 27,7 23,7 @@ fn on_scroll(
),
>,
starfield_mid: Single<
- (&mut Sprite, &mut Transform, &mut Visibility),
+ (&mut Sprite, &mut Transform, &mut Visibility, Option<&StarfieldSize>),
(
With<StarfieldMid>,
Without<StarfieldBack>,
@@ 35,7 31,7 @@ fn on_scroll(
),
>,
starfield_front: Single<
- (&mut Sprite, &mut Transform, &mut Visibility),
+ (&mut Sprite, &mut Transform, &mut Visibility, Option<&StarfieldSize>),
(
With<StarfieldFront>,
Without<StarfieldBack>,
@@ 63,10 59,10 @@ fn on_scroll(
),
>,
) {
- let (mut starfield_back, mut starfield_back_pos, mut visibility_back) =
+ let (mut starfield_back, mut starfield_back_pos, mut visibility_back, size_back) =
starfield_back.into_inner();
- let (mut starfield_mid, mut starfield_mid_pos, mut visibility_mid) = starfield_mid.into_inner();
- let (mut starfield_front, mut starfield_front_pos, mut visibility_front) =
+ let (mut starfield_mid, mut starfield_mid_pos, mut visibility_mid, size_mid) = starfield_mid.into_inner();
+ let (mut starfield_front, mut starfield_front_pos, mut visibility_front, size_front) =
starfield_front.into_inner();
for event in scroll_events.read() {
match event.unit {
@@ 77,10 73,36 @@ fn on_scroll(
camera.scale *= 1.03;
}
if camera.scale.z > 50.0 {
+ starfield_back.image_mode = SpriteImageMode::Auto;
+ starfield_mid.image_mode = SpriteImageMode::Auto;
+ starfield_front.image_mode = SpriteImageMode::Auto;
*visibility_back = Visibility::Hidden;
*visibility_mid = Visibility::Hidden;
*visibility_front = Visibility::Hidden;
} else {
+ if matches!(*visibility_back, Visibility::Hidden) {
+ if let Some(size_back) = size_back {
+ starfield_back.image_mode = SpriteImageMode::Tiled {
+ tile_x: true,
+ tile_y: true,
+ stretch_value: size_back.0,
+ };
+ }
+ if let Some(size_mid) = size_mid {
+ starfield_mid.image_mode = SpriteImageMode::Tiled {
+ tile_x: true,
+ tile_y: true,
+ stretch_value: size_mid.0,
+ };
+ }
+ if let Some(size_front) = size_front{
+ starfield_front.image_mode = SpriteImageMode::Tiled {
+ tile_x: true,
+ tile_y: true,
+ stretch_value: size_front.0,
+ };
+ }
+ }
*visibility_back = Visibility::Inherited;
*visibility_mid = Visibility::Inherited;
*visibility_front = Visibility::Inherited;