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
use crate::*;
/// Renders ascii characters.
pub fn render_ascii<'a>(
ctx: &mut Terminal,
camera: &Camera,
positions: &Components<Point>,
multi_sprites: &Components<MultiSprite>,
sprites: &Components<Sprite>,
) {
{
// TODO add the camera check to multisprites
for (pos, multi) in join!(&positions && &multi_sprites) {
let multi = multi.unwrap();
for y in 0..multi.height as i32 {
for x in 0..multi.width as i32 {
let idx = (x + y * multi.width as i32) as usize;
ctx.print_color(
pos.unwrap().x + x - camera.position.x,
pos.unwrap().y + y - camera.position.y,
multi.fg[idx],
multi.bg[idx],
multi.ascii.chars().nth(idx).unwrap(),
);
}
}
}
for (pos, sprite) in join!(&positions && &sprites) {
let pos = pos.unwrap();
let sprite = sprite.unwrap();
// the position of the camera is its position in the world, not
// its offset on screen.
// TODO make it so we can define the camera on screen as a square.
// (add screenspace coords)
if position_inside_rect(
pos.x - camera.position.x,
pos.y - camera.position.y,
0,
0,
camera.size.x as u32,
camera.size.y as u32,
) {
ctx.print_color(
pos.x - camera.position.x + camera.screen_position.x,
pos.y - camera.position.y + camera.screen_position.y,
sprite.fg,
sprite.bg,
sprite.glyph,
);
}
}
ctx.flush();
}
}