summaryrefslogtreecommitdiff
path: root/src/map.rs
diff options
context:
space:
mode:
authortom barrett <spalf0@gmail.com>2019-06-27 10:00:42 -0500
committertom barrett <spalf0@gmail.com>2019-06-27 10:00:42 -0500
commita76efb8444af9d4a0ee558e72903c67bc2cff5d3 (patch)
treeb93849385e23e51466658502fe0a8a3064405ba5 /src/map.rs
parent93d0a0eb6a5c35ad8b82f368c5251d9690c508f9 (diff)
parentee8d055be8326eb1561900bcca6acd9e38071f4a (diff)
Merge branch 'master' into feature/dude
Diffstat (limited to 'src/map.rs')
-rw-r--r--src/map.rs91
1 files changed, 22 insertions, 69 deletions
diff --git a/src/map.rs b/src/map.rs
index bb5f694..ab436d1 100644
--- a/src/map.rs
+++ b/src/map.rs
@@ -1,10 +1,9 @@
use ggez::filesystem::File;
-use ggez::graphics::{spritebatch::SpriteBatch, DrawParam};
-use ggez::nalgebra::{Point2, Vector2};
-use std::f32::consts::PI;
+use ggez::graphics::spritebatch::SpriteBatch;
use xml::reader::XmlEvent::Characters;
use crate::constants;
+use crate::layer::Layer;
use crate::tileset::Tileset;
use crate::xmlelements::XMLElements;
@@ -15,17 +14,26 @@ pub struct Map {
}
impl Map {
- pub fn new(file: File) -> Map {
+ pub fn new(file: File, tileset: &Tileset) -> Map {
let elements = XMLElements::new(file);
- let width = elements.get_element_attribute("map", "width").unwrap();
- let height = elements.get_element_attribute("map", "height").unwrap();
+ let width = elements
+ .get_element_attribute("map", "width")
+ .unwrap()
+ .parse()
+ .unwrap();
+ let height = elements
+ .get_element_attribute("map", "height")
+ .unwrap()
+ .parse()
+ .unwrap();
+
let layers = elements
.events
.iter()
.filter_map(|e| {
if let Characters(text) = e {
- Some(Layer::new(text.to_string()))
+ Some(Layer::new(text, tileset, width, height))
} else {
None
}
@@ -39,28 +47,15 @@ impl Map {
}
}
- pub fn draw(&self, spritebatch: &mut SpriteBatch, tileset: &Tileset) {
+ pub fn draw(&self, spritebatch: &mut SpriteBatch) {
for layer in self.layers.iter() {
- for x in 0..self.width {
- for y in 0..self.height {
- let tile_id = layer.data[x + (y * self.height)];
- let (tile_id, rotate) = self.decode(tile_id as u32);
-
- let offset = (constants::TILE_WIDTH / 2.0) * constants::TILE_SCALE;
-
- let draw_param = DrawParam::default()
- .src(tileset.tiles[tile_id as usize])
- .rotation(rotate)
- .offset(Point2::new(0.5, 0.5))
- .dest(Point2::new(
- (constants::TILE_WIDTH * constants::TILE_SCALE * x as f32) + offset,
- (constants::TILE_HEIGHT * constants::TILE_SCALE * y as f32) + offset,
- ))
- .scale(Vector2::new(constants::TILE_SCALE, constants::TILE_SCALE));
+ layer.draw(spritebatch);
+ }
+ }
- spritebatch.add(draw_param);
- }
- }
+ pub fn update(&mut self) {
+ for layer in self.layers.iter_mut() {
+ layer.update();
}
}
@@ -70,46 +65,4 @@ impl Map {
(constants::TILE_HEIGHT * constants::TILE_SCALE) * self.height as f32,
)
}
-
- fn decode(&self, tile_id: u32) -> (u32, f32) {
- //let flip_d = (tile_id & constants::FLIP_DIAGONALLY_FLAG) == constants::FLIP_DIAGONALLY_FLAG;
- let flip_h =
- (tile_id & constants::FLIP_HORIZONTALLY_FLAG) == constants::FLIP_HORIZONTALLY_FLAG;
- let flip_v = (tile_id & constants::FLIP_VERTICALLY_FLAG) == constants::FLIP_VERTICALLY_FLAG;
-
- let new_tile_id = if flip_h | flip_v {
- tile_id & !constants::ALL_FLIP_FLAGS
- } else {
- tile_id
- };
-
- let rotate = match (flip_h, flip_v) {
- (true, false) => self.convert_angle_to_rad(90.0),
- (true, true) => self.convert_angle_to_rad(180.0),
- (false, true) => self.convert_angle_to_rad(270.0),
- (false, false) => 0.0,
- };
-
- (new_tile_id, rotate)
- }
-
- fn convert_angle_to_rad(&self, angle: f32) -> f32 {
- angle * (PI / 180.0)
- }
-}
-
-pub struct Layer {
- pub data: Vec<usize>,
-}
-
-impl Layer {
- pub fn new(text: String) -> Layer {
- Layer {
- data: text
- .replace("\n", "")
- .split(',')
- .map(|s| s.parse().unwrap())
- .collect(),
- }
- }
}