summaryrefslogtreecommitdiff
path: root/src/tileset.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/tileset.rs')
-rw-r--r--src/tileset.rs38
1 files changed, 31 insertions, 7 deletions
diff --git a/src/tileset.rs b/src/tileset.rs
index ae65097..a5c00af 100644
--- a/src/tileset.rs
+++ b/src/tileset.rs
@@ -1,37 +1,61 @@
use ggez::filesystem::File;
use ggez::graphics::Rect;
+use std::collections::HashMap;
use crate::constants;
-use crate::xmlelements::XMLElements;
+use crate::xmlelements::{XMLElements, Property};
pub struct Tileset {
- pub tiles: Vec<Rect>,
+ tiles: HashMap<usize, Rect>,
+ properties: HashMap<usize, Property>,
}
impl Tileset {
pub fn new(file: File) -> Tileset {
let elements = XMLElements::new(file);
- let height = elements.get_element_attribute("image", "height").unwrap();
+ let height = elements
+ .get_element_attribute("image", "height")
+ .unwrap()
+ .parse::<usize>()
+ .unwrap();
let columns = elements
.get_element_attribute("tileset", "columns")
+ .unwrap()
+ .parse::<usize>()
.unwrap();
let rows = height / (constants::TILE_HEIGHT as usize);
- let mut tiles = Vec::new();
- tiles.push(Rect::zero());
+ let mut tiles = HashMap::new();
+ tiles.insert(0, Rect::zero());
let w = 1.0 / columns as f32;
let h = 1.0 / rows as f32;
+ let mut key = 1;
for r in 0..rows {
for c in 0..columns {
let x = c as f32 / columns as f32;
let y = r as f32 / rows as f32;
- tiles.push(Rect::new(x, y, w, h));
+ tiles.insert(key, Rect::new(x, y, w, h));
+ key += 1;
}
}
- Tileset { tiles }
+ let mut properties = HashMap::new();
+
+ for tile_element in elements.get_elements("tile") {
+ let tile_id = XMLElements::get_attribute(&tile_element, "id").unwrap().parse().unwrap();
+
+ let property_elements = elements.get_children(&tile_element, "property");
+
+ properties.insert(tile_id, Property::new(property_elements));
+ }
+
+ Tileset { tiles, properties }
+ }
+
+ pub fn get(&self, id: usize) -> Rect {
+ *self.tiles.get(&id).unwrap()
}
}