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
use crate::image::Image;
use crate::image_loading::ImageWrapperError::*;
use crate::image_loading::{convert_image, ImageWrapperError};
use serde::Deserialize;
use std::collections::HashMap;
use std::fs;
#[derive(Debug, Deserialize, Clone, Eq, PartialEq)]
pub struct BasicTileset {
name: Option<String>,
image_file: String,
tile_sizes: TilesetSize,
tiles: Vec<TilesetTile>,
}
#[derive(Debug, Deserialize, Clone, Eq, PartialEq)]
struct TilesetSize {
width: usize,
height: usize,
}
#[derive(Debug, Deserialize, Clone, Eq, PartialEq)]
struct TilesetTile {
id: String,
x: usize,
y: usize,
}
impl BasicTileset {
pub fn load_from_file(path: &str) -> Result<HashMap<String, Image>, ImageWrapperError> {
let mut map = HashMap::new();
let json = fs::read_to_string(path).map_err(TilesetFileError)?;
let tileset: BasicTileset =
serde_json::from_str(&json).map_err(|err| TilesetFormatError(err.to_string()))?;
let tileset_image = image::open(&tileset.image_file).map_err(ImageFileError)?;
for tile in tileset.tiles {
let image = convert_image(tileset_image.crop_imm(
(tile.x * tileset.tile_sizes.width) as u32,
(tile.y * tileset.tile_sizes.height) as u32,
tileset.tile_sizes.width as u32,
tileset.tile_sizes.height as u32,
))?;
map.insert(tile.id, image);
}
Ok(map)
}
}