Skip to main content

starbloom_map/
chunk.rs

1use bevy_ecs::prelude::*;
2use macroquad::prelude::*;
3
4use starbloom_tiles::*;
5
6pub const CHUNK_DIM: usize = 16;
7
8pub const CHUNK_SIZE: f32 = CHUNK_DIM as f32 * TILE_SIZE;
9
10#[derive(Component)]
11pub struct Chunk {
12    x: u64, // No overflows for you any time soon
13    y: u64,
14    tiles: [[TileRepr; CHUNK_DIM]; CHUNK_DIM],
15}
16
17impl Chunk {
18    pub fn load(x: u64, y: u64) -> Self {
19        Self {
20            x,
21            y,
22            tiles: [[1; CHUNK_DIM]; CHUNK_DIM],
23        }
24    }
25
26    pub fn render(&self, tile_regestry: &TileRegestry) {
27        for (x, row) in self.tiles.iter().enumerate() {
28            for (y, tile_idx) in row.iter().enumerate() {
29                let tile = tile_regestry.get_tile_by_idx(tile_idx);
30                if !tile.renderable {
31                    continue;
32                }
33                draw_rectangle(
34                    self.x as f32 * CHUNK_SIZE + x as f32 * TILE_SIZE,
35                    self.y as f32 * CHUNK_SIZE + y as f32 * TILE_SIZE,
36                    TILE_SIZE,
37                    TILE_SIZE,
38                    GREEN,
39                );
40            }
41        }
42
43        let dim = measure_text(format!("{}, {}", self.x, self.y), None, 20, 1.);
44        draw_text(
45            format!("{}, {}", self.x, self.y),
46            self.x as f32 * CHUNK_SIZE,
47            self.y as f32 * CHUNK_SIZE + dim.height,
48            20.,
49            BLACK,
50        );
51    }
52
53    pub fn get(&self, x: usize, y: usize) -> TileRepr {
54        self.tiles[x][y]
55    }
56
57    pub fn get_bounding_rect(&self) -> Rect {
58        Rect::new(
59            self.x as f32 * CHUNK_SIZE,
60            self.y as f32 * CHUNK_SIZE,
61            CHUNK_SIZE,
62            CHUNK_SIZE,
63        )
64    }
65}