util.rs 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. use core::option::Option::{None, Some};
  2. use ggez::error::{GameError, GameResult};
  3. use ggez::GameError::GamepadError;
  4. use tiled::{Image as TiledImage, Layer, LayerData, Map as TiledMap, Tile as TiledTile, Tileset};
  5. pub fn extract_image_from_image_layer(
  6. tiled_map: &TiledMap,
  7. layer_name: &str,
  8. ) -> GameResult<TiledImage> {
  9. for image_layer in tiled_map.image_layers.iter() {
  10. if image_layer.name == layer_name {
  11. return match &image_layer.image {
  12. None => GameResult::Err(GameError::ResourceLoadError(format!(
  13. "No image in image layer {}",
  14. layer_name
  15. ))),
  16. Some(image) => GameResult::Ok(image.clone()),
  17. };
  18. }
  19. }
  20. return GameResult::Err(GameError::ResourceLoadError(format!(
  21. "Image layer {} not found in map ",
  22. layer_name
  23. )));
  24. }
  25. pub fn extract_image_from_tileset(tileset: &Tileset) -> GameResult<TiledImage> {
  26. match tileset.images.first() {
  27. None => {
  28. return GameResult::Err(GameError::ResourceLoadError(
  29. "No image found in givenn tileset".to_string(),
  30. ))
  31. }
  32. Some(terrain_image) => GameResult::Ok(terrain_image.clone()),
  33. }
  34. }
  35. pub fn extract_tileset(tiled_map: &TiledMap, tileset_name: &str) -> GameResult<Tileset> {
  36. match tiled_map
  37. .tilesets
  38. .clone()
  39. .into_iter()
  40. .filter(|t| t.name == tileset_name)
  41. .collect::<Vec<Tileset>>()
  42. .first()
  43. {
  44. None => {
  45. return GameResult::Err(GameError::ResourceLoadError(format!(
  46. "No tileset {} found in map ",
  47. tileset_name
  48. )))
  49. }
  50. Some(tileset) => GameResult::Ok(tileset.clone()),
  51. }
  52. }
  53. pub fn extract_layer(tiled_map: &TiledMap, layer_name: &str) -> GameResult<Layer> {
  54. match tiled_map
  55. .layers
  56. .clone()
  57. .into_iter()
  58. .filter(|l| l.name == layer_name)
  59. .collect::<Vec<Layer>>()
  60. .first()
  61. {
  62. None => {
  63. return GameResult::Err(GameError::ResourceLoadError(format!(
  64. "No {} layer found in map",
  65. layer_name
  66. )))
  67. }
  68. Some(layer) => GameResult::Ok(layer.clone()),
  69. }
  70. }
  71. pub fn extract_gids(layer: &Layer) -> GameResult<Vec<u32>> {
  72. let mut gids: Vec<u32> = vec![];
  73. match &layer.tiles {
  74. LayerData::Finite(layer_tiles) => {
  75. for (x, tiles_row) in layer_tiles.iter().enumerate() {
  76. for (y, layer_tile) in tiles_row.iter().enumerate() {
  77. if !gids.contains(&layer_tile.gid) {
  78. gids.push(layer_tile.gid);
  79. }
  80. }
  81. }
  82. }
  83. LayerData::Infinite(_) => {
  84. return GameResult::Err(GameError::ResourceLoadError(
  85. "Layer must be finite".to_string(),
  86. ))
  87. }
  88. }
  89. GameResult::Ok(gids)
  90. }
  91. pub fn get_tileset_i_for_gid(gid: u32, tilesets: &Vec<Tileset>) -> GameResult<usize> {
  92. for (i, tileset) in tilesets.iter().enumerate() {
  93. if gid >= tileset.first_gid && gid < tileset.first_gid + tileset.tilecount.unwrap() {
  94. return GameResult::Ok(i);
  95. }
  96. }
  97. return GameResult::Err(GameError::ResourceLoadError(format!(
  98. "gid {} not found for given tilesets",
  99. gid
  100. )));
  101. }
  102. pub fn extract_tilesets_containing_gids(
  103. tiled_map: &TiledMap,
  104. decor_tile_gids: Vec<u32>,
  105. ) -> Vec<Tileset> {
  106. let mut tilesets: Vec<Tileset> = vec![];
  107. for tileset in tiled_map.tilesets.iter() {
  108. for decor_tile_gid in &decor_tile_gids {
  109. if *decor_tile_gid >= tileset.first_gid
  110. && *decor_tile_gid < tileset.first_gid + tileset.tilecount.unwrap()
  111. {
  112. if !tilesets.contains(&tileset) {
  113. tilesets.push(tileset.clone());
  114. }
  115. }
  116. }
  117. }
  118. tilesets
  119. }
  120. pub fn extract_tileset_images(tilesets: &Vec<Tileset>) -> GameResult<Vec<TiledImage>> {
  121. let mut images: Vec<TiledImage> = vec![];
  122. for tileset in tilesets.iter() {
  123. images.push(extract_image_from_tileset(tileset)?)
  124. }
  125. GameResult::Ok(images)
  126. }