TiledMapTilesetReader.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using Microsoft.Xna.Framework;
  2. using Microsoft.Xna.Framework.Content;
  3. using Microsoft.Xna.Framework.Graphics;
  4. using MonoGame.Extended.Content;
  5. using System;
  6. namespace MonoGame.Extended.Tiled
  7. {
  8. public class TiledMapTilesetReader : ContentTypeReader<TiledMapTileset>
  9. {
  10. protected override TiledMapTileset Read(ContentReader reader, TiledMapTileset existingInstance)
  11. {
  12. if (existingInstance != null)
  13. return existingInstance;
  14. return ReadTileset(reader);
  15. }
  16. public static TiledMapTileset ReadTileset(ContentReader reader)
  17. {
  18. var texture = reader.ReadExternalReference<Texture2D>();
  19. var @class = reader.ReadString();
  20. var tileWidth = reader.ReadInt32();
  21. var tileHeight = reader.ReadInt32();
  22. var tileCount = reader.ReadInt32();
  23. var spacing = reader.ReadInt32();
  24. var margin = reader.ReadInt32();
  25. var columns = reader.ReadInt32();
  26. var explicitTileCount = reader.ReadInt32();
  27. var tileset = new TiledMapTileset(texture, @class, tileWidth, tileHeight, tileCount, spacing, margin, columns);
  28. for (var tileIndex = 0; tileIndex < explicitTileCount; tileIndex++)
  29. ReadTile(reader, tileset);
  30. reader.ReadTiledMapProperties(tileset.Properties);
  31. return tileset;
  32. }
  33. private static void ReadTile(ContentReader reader, TiledMapTileset tileset)
  34. {
  35. var texture = reader.ReadExternalReference<Texture2D>();
  36. var localTileIdentifier = reader.ReadInt32();
  37. var type = reader.ReadString();
  38. var animationFramesCount = reader.ReadInt32();
  39. var objectCount = reader.ReadInt32();
  40. var objects = new TiledMapObject[objectCount];
  41. for (var i = 0; i < objectCount; i++)
  42. objects[i] = ReadTiledMapObject(reader, tileset);
  43. var tilesetTile = animationFramesCount <= 0
  44. ? new TiledMapTilesetTile(localTileIdentifier, type, objects, texture)
  45. : new TiledMapTilesetAnimatedTile(localTileIdentifier,
  46. ReadTiledMapTilesetAnimationFrames(reader, tileset, animationFramesCount), type, objects, texture);
  47. reader.ReadTiledMapProperties(tilesetTile.Properties);
  48. tileset.Tiles.Add(tilesetTile);
  49. }
  50. private static TiledMapTilesetTileAnimationFrame[] ReadTiledMapTilesetAnimationFrames(ContentReader reader, TiledMapTileset tileset, int animationFramesCount)
  51. {
  52. var animationFrames = new TiledMapTilesetTileAnimationFrame[animationFramesCount];
  53. for (var i = 0; i < animationFramesCount; i++)
  54. {
  55. var localTileIdentifierForFrame = reader.ReadInt32();
  56. var frameDurationInMilliseconds = reader.ReadInt32();
  57. var tileSetTileFrame = new TiledMapTilesetTileAnimationFrame(tileset, localTileIdentifierForFrame, frameDurationInMilliseconds);
  58. animationFrames[i] = tileSetTileFrame;
  59. }
  60. return animationFrames;
  61. }
  62. private static TiledMapTilesetTile ReadTiledMapTilesetTile(ContentReader reader, TiledMapTileset tileset, Func<TiledMapObject[], TiledMapTilesetTile> createTile)
  63. {
  64. var texture = reader.ReadExternalReference<Texture2D>();
  65. var objectCount = reader.ReadInt32();
  66. var objects = new TiledMapObject[objectCount];
  67. for (var i = 0; i < objectCount; i++)
  68. objects[i] = ReadTiledMapObject(reader, tileset);
  69. return createTile(objects);
  70. }
  71. private static TiledMapObject ReadTiledMapObject(ContentReader reader, TiledMapTileset tileset)
  72. {
  73. var objectType = (TiledMapObjectType)reader.ReadByte();
  74. var identifier = reader.ReadInt32();
  75. var name = reader.ReadString();
  76. var type = reader.ReadString();
  77. var position = new Vector2(reader.ReadSingle(), reader.ReadSingle());
  78. var width = reader.ReadSingle();
  79. var height = reader.ReadSingle();
  80. var size = new SizeF(width, height);
  81. var rotation = reader.ReadSingle();
  82. var isVisible = reader.ReadBoolean();
  83. var properties = new TiledMapProperties();
  84. const float opacity = 1.0f;
  85. reader.ReadTiledMapProperties(properties);
  86. TiledMapObject mapObject;
  87. switch (objectType)
  88. {
  89. case TiledMapObjectType.Rectangle:
  90. mapObject = new TiledMapRectangleObject(identifier, name, size, position, rotation, opacity, isVisible, type);
  91. break;
  92. case TiledMapObjectType.Tile:
  93. reader.ReadUInt32(); // Tile objects within TiledMapTilesetTiles currently ignore the gid and behave like rectangle objects.
  94. mapObject = new TiledMapRectangleObject(identifier, name, size, position, rotation, opacity, isVisible, type);
  95. break;
  96. case TiledMapObjectType.Ellipse:
  97. mapObject = new TiledMapEllipseObject(identifier, name, size, position, rotation, opacity, isVisible);
  98. break;
  99. case TiledMapObjectType.Polygon:
  100. mapObject = new TiledMapPolygonObject(identifier, name, ReadPoints(reader), size, position, rotation, opacity, isVisible, type);
  101. break;
  102. case TiledMapObjectType.Polyline:
  103. mapObject = new TiledMapPolylineObject(identifier, name, ReadPoints(reader), size, position, rotation, opacity, isVisible, type);
  104. break;
  105. default:
  106. throw new ArgumentOutOfRangeException();
  107. }
  108. foreach (var property in properties)
  109. mapObject.Properties.Add(property.Key, property.Value);
  110. return mapObject;
  111. }
  112. private static Vector2[] ReadPoints(ContentReader reader)
  113. {
  114. var pointCount = reader.ReadInt32();
  115. var points = new Vector2[pointCount];
  116. for (var i = 0; i < pointCount; i++)
  117. {
  118. var x = reader.ReadSingle();
  119. var y = reader.ReadSingle();
  120. points[i] = new Vector2(x, y);
  121. }
  122. return points;
  123. }
  124. }
  125. }