~starkingdoms/starkingdoms

ref: 0419a69e7e10e1365dcd6051ed5bed8c789808f7 starkingdoms/crates/unified/src/client/zoom.rs -rw-r--r-- 3.4 KiB
0419a69e — ghostly_zsh merge zoom 5 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
use bevy::{input::mouse::{MouseScrollUnit, MouseWheel}, prelude::*};

use crate::{client::{starfield::{BACK_STARFIELD_SIZE, FRONT_STARFIELD_SIZE, MID_STARFIELD_SIZE}, Me}, ecs::{MainCamera, StarfieldBack, StarfieldFront, StarfieldMid}};

pub fn zoom_plugin(app: &mut App) {
    app.add_systems(Update, on_scroll);
}

fn on_scroll(
    mut scroll_events: EventReader<MouseWheel>,
    window: Single<&Window>,
    starfield_back: Single<
        (&mut Sprite, &mut Transform),
        (
            With<StarfieldBack>,
            Without<StarfieldMid>,
            Without<StarfieldFront>,
        ),
    >,
    starfield_mid: Single<
        (&mut Sprite, &mut Transform),
        (
            With<StarfieldMid>,
            Without<StarfieldBack>,
            Without<StarfieldFront>,
        ),
    >,
    starfield_front: Single<
        (&mut Sprite, &mut Transform),
        (
            With<StarfieldFront>,
            Without<StarfieldBack>,
            Without<StarfieldMid>,
        ),
    >,
    mut camera: Single<&mut Transform, (With<MainCamera>, Without<Me>, Without<StarfieldFront>, Without<StarfieldMid>, Without<StarfieldBack>)>,
    player: Single<&Transform, (With<Me>, Without<StarfieldFront>, Without<StarfieldMid>, Without<StarfieldBack>, Without<MainCamera>)>,
) {
    let (mut starfield_back, mut starfield_back_pos) = starfield_back.into_inner();
    let (mut starfield_mid, mut starfield_mid_pos) = starfield_mid.into_inner();
    let (mut starfield_front, mut starfield_front_pos) = starfield_front.into_inner();
    for event in scroll_events.read() {
        match event.unit {
            MouseScrollUnit::Line | MouseScrollUnit::Pixel => {
                if event.y > 0.0 {
                    camera.scale *= 0.97;
                } else {
                    camera.scale *= 1.03;
                }
                starfield_back.custom_size =
                    Some(window.size() * camera.scale.z + Vec2::splat(BACK_STARFIELD_SIZE * 2.0));
                starfield_mid.custom_size =
                    Some(window.size() * camera.scale.z + Vec2::splat(MID_STARFIELD_SIZE * 2.0));
                starfield_front.custom_size =
                    Some(window.size() * camera.scale.z + Vec2::splat(FRONT_STARFIELD_SIZE * 2.0));
                starfield_back_pos.translation = player.translation
                    + (-player.translation / 3.0) % BACK_STARFIELD_SIZE
                    + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0)*camera.scale.z/2.0) % BACK_STARFIELD_SIZE
                    + Vec3::new(0.0, BACK_STARFIELD_SIZE, 0.0)
                    - Vec3::new(0.0, 0.0, 5.0);
                starfield_mid_pos.translation = player.translation
                    + (-player.translation / 2.5) % MID_STARFIELD_SIZE
                    + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0)*camera.scale.z/2.0) % MID_STARFIELD_SIZE
                    + Vec3::new(0.0, MID_STARFIELD_SIZE, 0.0)
                    - Vec3::new(0.0, 0.0, 4.5);
                starfield_front_pos.translation = player.translation
                    + (-player.translation / 2.0) % FRONT_STARFIELD_SIZE
                    + (Vec3::new(window.resolution.width(), -window.resolution.height(), 0.0)*camera.scale.z/2.0) % FRONT_STARFIELD_SIZE
                    + Vec3::new(0.0, FRONT_STARFIELD_SIZE, 0.0)
                    - Vec3::new(0.0, 0.0, 4.0);
            }
        }
    }
}