diff --git a/src/layers/group.rs b/src/layers/group.rs index b0f9eded..f13de1dc 100644 --- a/src/layers/group.rs +++ b/src/layers/group.rs @@ -90,10 +90,34 @@ map_wrapper!( impl<'map> GroupLayer<'map> { /// Returns an iterator over the layers present in this group in display order. - pub fn layers(&self) -> impl ExactSizeIterator { - self.layers + /// ## Example + /// ``` + /// use tiled::Layer; + /// # use tiled::Loader; + /// + /// # fn main() { + /// # let map = Loader::new() + /// # .load_tmx_map("assets/tiled_group_layers.tmx") + /// # .unwrap(); + /// # + /// let nested_layers: Vec = map + /// .layers() + /// .filter_map(|layer| match layer.layer_type() { + /// tiled::LayerType::GroupLayer(layer) => Some(layer), + /// _ => None, + /// }) + /// .flat_map(|layer| layer.layers()) + /// .collect(); + /// + /// dbg!(nested_layers); + /// # } + /// ``` + pub fn layers(&self) -> impl ExactSizeIterator> + 'map { + let map: &'map crate::Map = self.map; + self.data + .layers .iter() - .map(move |layer| Layer::new(self.map, layer)) + .map(move |layer| Layer::new(map, layer)) } /// Gets a specific layer from the group by index. pub fn get_layer(&self, index: usize) -> Option { diff --git a/src/layers/object.rs b/src/layers/object.rs index 55aca661..391d7d48 100644 --- a/src/layers/object.rs +++ b/src/layers/object.rs @@ -68,10 +68,36 @@ impl<'map> ObjectLayer<'map> { /// Returns an iterator over the objects present in this layer, in the order they were declared /// in in the TMX file. + /// + /// ## Example + /// ``` + /// # use tiled::Loader; + /// use tiled::Object; + /// + /// # fn main() { + /// # let map = Loader::new() + /// # .load_tmx_map("assets/tiled_group_layers.tmx") + /// # .unwrap(); + /// # + /// let spawnpoints: Vec = map + /// .layers() + /// .filter_map(|layer| match layer.layer_type() { + /// tiled::LayerType::ObjectLayer(layer) => Some(layer), + /// _ => None, + /// }) + /// .flat_map(|layer| layer.objects()) + /// .filter(|object| object.obj_type == "spawn") + /// .collect(); + /// + /// dbg!(spawnpoints); + /// # } + /// ``` #[inline] - pub fn objects(&self) -> impl ExactSizeIterator { - self.objects + pub fn objects(&self) -> impl ExactSizeIterator> + 'map { + let map: &'map crate::Map = self.map; + self.data + .objects .iter() - .map(move |object| Object::new(self.map, object)) + .map(move |object| Object::new(map, object)) } } diff --git a/src/map.rs b/src/map.rs index a8903ee8..2dba8fc1 100644 --- a/src/map.rs +++ b/src/map.rs @@ -114,6 +114,31 @@ impl Map { } /// Get an iterator over all the layers in the map in ascending order of their layer index. + /// + /// ## Example + /// ``` + /// # use tiled::Loader; + /// # + /// # fn main() { + /// # struct Renderer; + /// # impl Renderer { + /// # fn render(&self, _: tiled::TileLayer) {} + /// # } + /// # let my_renderer = Renderer; + /// # let map = Loader::new() + /// # .load_tmx_map("assets/tiled_group_layers.tmx") + /// # .unwrap(); + /// # + /// let tile_layers = map.layers().filter_map(|layer| match layer.layer_type() { + /// tiled::LayerType::TileLayer(layer) => Some(layer), + /// _ => None, + /// }); + /// + /// for layer in tile_layers { + /// my_renderer.render(layer); + /// } + /// # } + /// ``` #[inline] pub fn layers(&self) -> impl ExactSizeIterator { self.layers.iter().map(move |layer| Layer::new(self, layer))