TiledMap.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using Microsoft.Xna.Framework;
  6. namespace MonoGame.Extended.Tiled
  7. {
  8. public sealed class TiledMap
  9. {
  10. private readonly List<TiledMapImageLayer> _imageLayers = new List<TiledMapImageLayer>();
  11. private readonly List<TiledMapLayer> _layers = new List<TiledMapLayer>();
  12. private readonly Dictionary<string, TiledMapLayer> _layersByName = new Dictionary<string, TiledMapLayer>();
  13. private readonly List<TiledMapObjectLayer> _objectLayers = new List<TiledMapObjectLayer>();
  14. private readonly List<TiledMapTileLayer> _tileLayers = new List<TiledMapTileLayer>();
  15. private readonly List<TiledMapTileset> _tilesets = new List<TiledMapTileset>();
  16. private readonly List<Tuple<TiledMapTileset, int>> _firstGlobalIdentifiers = new List<Tuple<TiledMapTileset, int>>();
  17. public string Name { get; }
  18. public string Type { get; }
  19. public int Width { get; }
  20. public int Height { get; }
  21. public int TileWidth { get; }
  22. public int TileHeight { get; }
  23. public TiledMapTileDrawOrder RenderOrder { get; }
  24. public TiledMapOrientation Orientation { get; }
  25. public TiledMapProperties Properties { get; }
  26. public ReadOnlyCollection<TiledMapTileset> Tilesets { get; }
  27. public ReadOnlyCollection<TiledMapLayer> Layers { get; }
  28. public ReadOnlyCollection<TiledMapImageLayer> ImageLayers { get; }
  29. public ReadOnlyCollection<TiledMapTileLayer> TileLayers { get; }
  30. public ReadOnlyCollection<TiledMapObjectLayer> ObjectLayers { get; }
  31. public Color? BackgroundColor { get; set; }
  32. public int WidthInPixels => Width * TileWidth;
  33. public int HeightInPixels => Height * TileHeight;
  34. private TiledMap()
  35. {
  36. Layers = new ReadOnlyCollection<TiledMapLayer>(_layers);
  37. ImageLayers = new ReadOnlyCollection<TiledMapImageLayer>(_imageLayers);
  38. TileLayers = new ReadOnlyCollection<TiledMapTileLayer>(_tileLayers);
  39. ObjectLayers = new ReadOnlyCollection<TiledMapObjectLayer>(_objectLayers);
  40. Tilesets = new ReadOnlyCollection<TiledMapTileset>(_tilesets);
  41. Properties = new TiledMapProperties();
  42. }
  43. public TiledMap(string name, string type, int width, int height, int tileWidth, int tileHeight, TiledMapTileDrawOrder renderOrder, TiledMapOrientation orientation, Color? backgroundColor = null)
  44. : this()
  45. {
  46. Name = name;
  47. Type = type;
  48. Width = width;
  49. Height = height;
  50. TileWidth = tileWidth;
  51. TileHeight = tileHeight;
  52. RenderOrder = renderOrder;
  53. Orientation = orientation;
  54. BackgroundColor = backgroundColor;
  55. }
  56. public void AddTileset(TiledMapTileset tileset, int firstGlobalIdentifier)
  57. {
  58. _tilesets.Add(tileset);
  59. _firstGlobalIdentifiers.Add(new Tuple<TiledMapTileset, int>(tileset, firstGlobalIdentifier));
  60. }
  61. public void AddLayer(TiledMapLayer layer)
  62. => AddLayer(layer, true);
  63. private void AddLayer(TiledMapLayer layer, bool root)
  64. {
  65. if (root) _layers.Add(layer);
  66. if (_layersByName.ContainsKey(layer.Name))
  67. throw new ArgumentException($"The TiledMap '{Name}' contains two or more layers named '{layer.Name}'. Please ensure all layers have unique names.");
  68. _layersByName.Add(layer.Name, layer);
  69. switch(layer)
  70. {
  71. case TiledMapImageLayer imageLayer:
  72. _imageLayers.Add(imageLayer);
  73. break;
  74. case TiledMapTileLayer tileLayer:
  75. _tileLayers.Add(tileLayer);
  76. break;
  77. case TiledMapObjectLayer objectLayer:
  78. _objectLayers.Add(objectLayer);
  79. break;
  80. case TiledMapGroupLayer groupLayer:
  81. foreach (var subLayer in groupLayer.Layers)
  82. AddLayer(subLayer, false);
  83. break;
  84. }
  85. }
  86. public TiledMapLayer GetLayer(string layerName)
  87. {
  88. TiledMapLayer layer;
  89. _layersByName.TryGetValue(layerName, out layer);
  90. return layer;
  91. }
  92. public T GetLayer<T>(string layerName)
  93. where T : TiledMapLayer
  94. {
  95. return GetLayer(layerName) as T;
  96. }
  97. public TiledMapTileset GetTilesetByTileGlobalIdentifier(int tileIdentifier)
  98. {
  99. foreach (var tileset in _firstGlobalIdentifiers)
  100. {
  101. if (tileIdentifier >= tileset.Item2 && tileIdentifier < tileset.Item2 + tileset.Item1.TileCount)
  102. return tileset.Item1;
  103. }
  104. return null;
  105. }
  106. public int GetTilesetFirstGlobalIdentifier(TiledMapTileset tileset)
  107. {
  108. return _firstGlobalIdentifiers.FirstOrDefault(t => t.Item1 == tileset).Item2;
  109. }
  110. private static int CountLayers(TiledMapLayer layer)
  111. {
  112. var value = 0;
  113. if (layer is TiledMapGroupLayer groupLayer)
  114. foreach (var subLayer in groupLayer.Layers)
  115. value += CountLayers(subLayer);
  116. else
  117. value = 1;
  118. return value;
  119. }
  120. }
  121. }