···
1
1
use crate::State;
2
2
-
use itertools::Itertools;
3
2
use shapemaker::*;
4
3
5
4
pub fn intro() -> Scene<State> {
6
5
Scene::<State>::new("intro")
7
6
.init(&|canvas, _| {
8
7
canvas.clear();
8
8
+
canvas.set_grid_size(16, 9);
9
9
canvas.set_background(Color::Black);
10
10
11
11
let mut kicks = Layer::new("anchor kick");
12
12
-
13
13
-
let circle_at = |x: usize, y: usize| Object::SmallCircle(Point(x, y));
14
14
-
15
15
-
let (end_x, end_y) = {
16
16
-
let Point(x, y) = canvas.world_region.end;
17
17
-
(x - 2, y - 2)
18
18
-
};
19
19
-
kicks.set("top left", circle_at(1, 1));
20
20
-
kicks.set("top right", circle_at(end_x, 1));
21
21
-
kicks.set("bottom left", circle_at(1, end_y));
22
22
-
kicks.set("bottom right", circle_at(end_x, end_y));
12
12
+
let kicks_in = canvas.world_region.resized(-2, -2);
13
13
+
kicks.set("top left", SmallCircle(kicks_in.topleft()));
14
14
+
kicks.set("top right", SmallCircle(kicks_in.topright()));
15
15
+
kicks.set("bottom left", SmallCircle(kicks_in.bottomleft()));
16
16
+
kicks.set("bottom right", SmallCircle(kicks_in.bottomright()));
23
17
canvas.add_or_replace_layer(kicks);
24
18
25
19
let mut ch = Layer::new("ch");
···
142
136
Ok(())
143
137
})
144
138
.on_note("ch", &|canvas, ctx| {
145
145
-
let world = canvas.world_region.clone();
139
139
+
let kicks_in = canvas.world_region.resized(-2, -2);
146
140
147
147
-
// keep only the last 2 dots
148
148
-
let dots_to_keep = canvas
149
149
-
.layer("ch")
150
150
-
.objects
151
151
-
.iter()
152
152
-
.sorted_by_key(|(name, _)| name.parse::<usize>().unwrap())
153
153
-
.rev()
154
154
-
.take(2)
155
155
-
.map(|(name, _)| name.clone())
156
156
-
.collect::<Vec<_>>();
141
141
+
let ch = canvas.layer_or_empty("ch");
157
142
158
158
-
let layer = canvas.layer("ch");
159
159
-
layer.object_sizes.empty_shape_stroke_width = 2.0;
160
160
-
layer.objects.retain(|name, _| dots_to_keep.contains(name));
143
143
+
let ch_position = kicks_in
144
144
+
.outline()
145
145
+
.nth(ctx.stem("ch").playcount % kicks_in.outline().count())
146
146
+
.unwrap_or(kicks_in.start);
161
147
162
162
-
let object_name = format!("{}", ctx.ms);
163
163
-
layer.set(
164
164
-
&object_name,
165
165
-
Object::Dot(
166
166
-
world.resized(-1, -1).random_point(&mut ctx.extra.rng),
167
167
-
)
168
168
-
.colored(Color::Cyan),
169
169
-
);
148
148
+
ch.set("hihat", Dot(ch_position).colored(Red));
170
149
171
150
canvas.put_layer_on_top("ch");
172
151
Ok(())
···
14
14
ctx.extra.kick_counter += 1;
15
15
sky(ctx.extra.kick_counter, canvas)
16
16
})
17
17
-
.each_n_frame(3, &|canvas, ctx| {
17
17
+
.each_n_frame(1, &|canvas, ctx| {
18
18
// Keep spacecraft alive, by animating on threes
19
19
sky(ctx.extra.kick_counter, canvas)
20
20
})