diff --git a/map/src/lib.rs b/map/src/lib.rs index 57b455a..4ba63c6 100644 --- a/map/src/lib.rs +++ b/map/src/lib.rs @@ -4,13 +4,14 @@ use thiserror::Error; use tiled::{LayerType, Loader}; pub mod tiles; -use tiles::{InvalidTileID, MapBaseTile}; +use tiles::{InvalidTileID, MapBaseTile, ObjectTile}; #[derive(Clone, Debug, SelfRustTokenize)] pub struct Map { pub width: u8, pub height: u8, - pub base_layer: Vec> + pub base_layer: Vec>, + pub object_layer: Vec>> } #[derive(Error, Debug)] @@ -32,11 +33,13 @@ pub enum MapError { } impl Map { + // this is ugly. Should i refactor this? pub fn from_tmx(path: impl AsRef) -> Result { let map = Loader::new().load_tmx_map(path)?; let width: u8 = map.width.try_into().map_err(|_| MapError::ToWidth)?; let height: u8 = map.height.try_into().map_err(|_| MapError::ToHight)?; let mut base_layer = Vec::with_capacity(height as usize); + let mut object_layer = Vec::with_capacity(height as usize); for (i, layer) in map.layers().enumerate() { match i { 0 => match layer.layer_type() { @@ -55,13 +58,30 @@ impl Map { }, _ => return Err(MapError::WrongLayer(i, "TileLayer".to_owned())) }, + 1 => match layer.layer_type() { + LayerType::Tiles(tile_layer) => { + for x in 0..width { + let mut column = Vec::with_capacity(width as usize); + for y in 0..height { + let tile = match tile_layer.get_tile(x.into(), y.into()) { + Some(tile) => Some(ObjectTile::try_from(tile.id())?), + None => None + }; + column.push(tile); + } + object_layer.push(column); + } + }, + _ => return Err(MapError::WrongLayer(i, "TileLayer".to_owned())) + }, _ => return Err(MapError::ToManyLayers) } } Ok(Map { width, height, - base_layer + base_layer, + object_layer }) } @@ -74,4 +94,14 @@ impl Map { .map(move |(y, item)| (x as u8, y as u8, item)) }) } + + /// return an iterator over all ObjectTiles and its x and y postion + pub fn iter_object_layer(&self) -> impl Iterator + '_ { + self.object_layer.iter().enumerate().flat_map(|(x, y_vec)| { + y_vec + .iter() + .enumerate() + .filter_map(move |(y, item)| item.map(|item| (x as u8, y as u8, item))) + }) + } } diff --git a/map/src/tiles.rs b/map/src/tiles.rs index f2090e1..10a37ba 100644 --- a/map/src/tiles.rs +++ b/map/src/tiles.rs @@ -2,6 +2,12 @@ use num_enum::TryFromPrimitive; use self_rust_tokenize::SelfRustTokenize; use thiserror::Error; +#[derive(Debug, Copy, Clone, Error)] +pub enum InvalidTileID { + #[error("invalid tiel id {0}")] + InvalidId(u32) +} + ///Store all Tiles, with can be used at the map background #[derive( Clone, Copy, Debug, Default, Eq, SelfRustTokenize, PartialEq, TryFromPrimitive, @@ -10,14 +16,7 @@ use thiserror::Error; pub enum MapBaseTile { //numbers must match them from the Tiled tilesets #[default] - Grass = 0, - Stone = 1 -} - -#[derive(Debug, Copy, Clone, Error)] -pub enum InvalidTileID { - #[error("invalid tiel id {0}")] - InvalidId(u32) + Grass = 0 } impl TryFrom for MapBaseTile { @@ -29,3 +28,21 @@ impl TryFrom for MapBaseTile { Self::try_from_primitive(value_u8).map_err(|_| Self::Error::InvalidId(value)) } } + +///Store all Tiles, with can be place the layer above the background +#[derive(Clone, Copy, Debug, Eq, SelfRustTokenize, PartialEq, TryFromPrimitive)] +#[repr(u8)] +pub enum ObjectTile { + //numbers must match them from the Tiled tilesets + Stone = 0 +} + +impl TryFrom for ObjectTile { + type Error = InvalidTileID; + fn try_from(value: u32) -> Result { + let value_u8: u8 = value + .try_into() + .map_err(|_| Self::Error::InvalidId(value))?; + Self::try_from_primitive(value_u8).map_err(|_| Self::Error::InvalidId(value)) + } +} diff --git a/pc/assets/img/BaseTiles/BaseTiles.tsx b/pc/assets/img/BaseTiles/BaseTiles.tsx index 3b8b6d0..6c77715 100644 --- a/pc/assets/img/BaseTiles/BaseTiles.tsx +++ b/pc/assets/img/BaseTiles/BaseTiles.tsx @@ -1,10 +1,7 @@ - + - - - diff --git a/pc/assets/img/BaseTiles/Grass mit Rand.png b/pc/assets/img/BaseTiles/Grass mit Rand.png deleted file mode 100644 index 9b0e368..0000000 Binary files a/pc/assets/img/BaseTiles/Grass mit Rand.png and /dev/null differ diff --git a/pc/assets/img/BaseTiles/Grass mit Rand2.png b/pc/assets/img/BaseTiles/Grass mit Rand2.png deleted file mode 100644 index 838fa62..0000000 Binary files a/pc/assets/img/BaseTiles/Grass mit Rand2.png and /dev/null differ diff --git a/pc/assets/img/BaseTiles/grass.png b/pc/assets/img/BaseTiles/grass.png index b3649cf..838fa62 100644 Binary files a/pc/assets/img/BaseTiles/grass.png and b/pc/assets/img/BaseTiles/grass.png differ diff --git a/pc/assets/img/BaseTiles/stone.png b/pc/assets/img/BaseTiles/stone.png deleted file mode 100644 index 3e2b580..0000000 Binary files a/pc/assets/img/BaseTiles/stone.png and /dev/null differ diff --git a/pc/assets/img/ObjectTiles/ObjectTiles.tsx b/pc/assets/img/ObjectTiles/ObjectTiles.tsx new file mode 100644 index 0000000..aed69c1 --- /dev/null +++ b/pc/assets/img/ObjectTiles/ObjectTiles.tsx @@ -0,0 +1,2 @@ + + diff --git a/pc/assets/img/BaseTiles/Stein ohne Hintergrund.png b/pc/assets/img/ObjectTiles/stone.png similarity index 100% rename from pc/assets/img/BaseTiles/Stein ohne Hintergrund.png rename to pc/assets/img/ObjectTiles/stone.png diff --git a/pc/assets/level/001.tmx b/pc/assets/level/001.tmx index 559f5a4..507cc91 100644 --- a/pc/assets/level/001.tmx +++ b/pc/assets/level/001.tmx @@ -1,17 +1,31 @@ - + - + + 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,2,2,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, -1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, +1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1, 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 + + + + +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,2,2,0,2,0,0,0,0, +0,0,0,0,0,0,0,0,2,2,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0