-
Notifications
You must be signed in to change notification settings - Fork 4
/
mirrors.rs
110 lines (101 loc) · 2.93 KB
/
mirrors.rs
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
mod shared;
use bevy::{ecs::system::RunSystemOnce, prelude::*, window::PrimaryWindow};
use bevy_scroller::*;
use shared::get_app;
use std::f32::consts::PI;
fn main() {
get_app("mirrors".into()).add_systems(Startup, start).run();
}
pub fn start(world: &mut World) {
let mirrors = world.register_system(spawn_mirrors);
let scroller_entity = world.run_system_once(spawn_scroller);
world
.entity_mut(scroller_entity)
.insert(OnScrollerInit(mirrors));
}
pub fn spawn_scroller(
mut commands: Commands,
windows: Query<&Window, With<PrimaryWindow>>,
asset_server: Res<AssetServer>,
) -> Entity {
let window = windows.get_single().expect("no primary window");
let sprite_size = Vec2::new(128., 128.);
commands.spawn(Camera2dBundle::default());
let items = (1..=7)
.map(|i| {
let path = format!("gems/{i}.png");
let _: Handle<Image> = asset_server.load(path.clone());
SpriteScrollerItem {
path,
size: Vec2 { x: 128., y: 128. },
}
})
.collect::<Vec<SpriteScrollerItem>>();
commands
.spawn((
ScrollerSize {
size: Vec2::new(window.width(), sprite_size.y),
},
ScrollerBundle {
scroller: Scroller {
speed: 5.,
render_layer: Some(1),
..default()
},
generator: RandomSequenceSpriteGenerator { items },
spatial: SpatialBundle::from_transform(Transform::from_translation(Vec3::new(
0.,
(sprite_size.y - window.height()) / 2.,
10.,
))),
..default()
},
))
.id()
}
fn spawn_mirrors(
In(scroller_entity): In<Entity>,
mut commands: Commands,
windows: Query<&Window, With<PrimaryWindow>>,
q_scroller: Query<&Scroller>,
) {
let scroller = q_scroller.get(scroller_entity).unwrap();
let window = windows.get_single().expect("no primary window");
let sprite_size = Vec2::new(128., 128.);
commands.spawn((
SpriteBundle {
texture: scroller.texture_handle.clone(),
transform: Transform {
translation: Vec3::new(0., (window.height() - sprite_size.y) / 2., 10.),
rotation: Quat::from_rotation_y(PI) * Quat::from_rotation_z(PI),
..default()
},
..default()
},
Name::new("Scroller mirror top"),
));
commands.spawn((
SpriteBundle {
texture: scroller.texture_handle.clone(),
transform: Transform {
translation: Vec3::new((window.width() - sprite_size.x) / 2., 0., 00.),
rotation: Quat::from_rotation_z(PI / 2.),
..default()
},
..default()
},
Name::new("Scroller mirror right"),
));
commands.spawn((
SpriteBundle {
texture: scroller.texture_handle.clone(),
transform: Transform {
translation: Vec3::new((sprite_size.x - window.width()) / 2., 0., 0.),
rotation: Quat::from_rotation_y(PI) * Quat::from_rotation_z(PI / 2.),
..default()
},
..default()
},
Name::new("Scroller mirror left"),
));
}