diff options
author | tom barrett <spalf0@gmail.com> | 2019-06-16 05:46:46 -0500 |
---|---|---|
committer | tom barrett <spalf0@gmail.com> | 2019-06-16 05:46:46 -0500 |
commit | 4cbbf41696dfc76c5a2f758aaa994466a852a489 (patch) | |
tree | 8547d57aa2100a6086f63655233726e35d37acf6 /src/map.rs | |
parent | 895dd470ecf26faa2db3ba7faf5d02b2ae220d5c (diff) |
created new parser
Diffstat (limited to 'src/map.rs')
-rw-r--r-- | src/map.rs | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/src/map.rs b/src/map.rs new file mode 100644 index 0000000..2028b50 --- /dev/null +++ b/src/map.rs @@ -0,0 +1,92 @@ +use ggez::filesystem::File; +use ggez::graphics::Rect; +use std::io::BufReader; +use xml::reader::{EventReader, XmlEvent}; + +pub struct Map { + pub width: usize, + pub height: usize, + pub data: Vec<usize>, +} + +impl Map { + pub fn new(file: File) -> Map { + let mut width = None; + let mut height = None; + let mut data: Option<Vec<usize>> = None; + + for e in EventReader::new(BufReader::new(file)) { + if let Ok(XmlEvent::StartElement { + name, attributes, .. + }) = e + { + if name.local_name == "map" { + for attribute in attributes { + match attribute.name.local_name.as_str() { + "width" => width = Some(attribute.value.parse::<usize>().unwrap()), + "height" => height = Some(attribute.value.parse::<usize>().unwrap()), + _ => (), + } + } + } + } else if let Ok(XmlEvent::Characters(text)) = e { + data = Some( + text.replace("\n", "") + .split(',') + .map(|s| s.parse().unwrap()) + .collect(), + ); + } + } + + Map { + data: data.unwrap(), + width: width.unwrap(), + height: height.unwrap(), + } + } +} + +pub struct Tileset { + pub tiles: Vec<Rect>, + pub tile_width: f32, + pub tile_height: f32, +} + +impl Tileset { + pub fn new(file: File) -> Tileset { + let mut tile_width = None; + let mut tile_height = None; + let mut columns = None; + + for e in EventReader::new(BufReader::new(file)) { + if let Ok(XmlEvent::StartElement { attributes, .. }) = e { + for attribute in attributes { + match attribute.name.local_name.as_str() { + "columns" => columns = Some(attribute.value.parse::<usize>().unwrap()), + "tilewidth" => tile_width = Some(attribute.value.parse::<f32>().unwrap()), + "tileheight" => tile_height = Some(attribute.value.parse::<f32>().unwrap()), + _ => (), + } + } + } + } + + let columns = columns.unwrap(); + + let mut tiles = Vec::new(); + tiles.push(Rect::zero()); + + for c in 0..columns { + let x = c as f32 / columns as f32; + let w = (c as f32 + 1.0) / columns as f32; + tiles.push(Rect::new(x, 0.0, w, 1.0)); + } + + Tileset { + tiles, + tile_height: tile_height.unwrap(), + tile_width: tile_width.unwrap(), + } + } +} |