summaryrefslogtreecommitdiff
path: root/src/map.rs
diff options
context:
space:
mode:
authortom barrett <spalf0@gmail.com>2019-06-22 10:11:18 -0500
committertom barrett <spalf0@gmail.com>2019-06-22 10:11:18 -0500
commitcccfb66c7c58bf464252e942ef2b742b41ece19e (patch)
tree8d13331a5cb65343d1a668d6dbb3fa4a62fb598a /src/map.rs
parent99c6e61a2b8fe66dcef7eada525f6fbdd7a2cd00 (diff)
now draw at the tile level
Diffstat (limited to 'src/map.rs')
-rw-r--r--src/map.rs75
1 files changed, 7 insertions, 68 deletions
diff --git a/src/map.rs b/src/map.rs
index bb5f694..38fb326 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,18 @@ 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 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 +39,9 @@ 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));
-
- spritebatch.add(draw_param);
- }
- }
+ layer.draw(spritebatch);
}
}
@@ -70,46 +51,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(),
- }
- }
}