TiledMapTilesetWriter.cs 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using System;
  2. using System.Globalization;
  3. using Microsoft.Xna.Framework.Content.Pipeline;
  4. using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
  5. using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler;
  6. using MonoGame.Extended.Content.Tiled;
  7. using MonoGame.Extended.Tiled;
  8. namespace MonoGame.Extended.Content.Pipeline.Tiled
  9. {
  10. [ContentTypeWriter]
  11. public class TiledMapTilesetWriter : ContentTypeWriter<TiledMapTilesetContentItem>
  12. {
  13. public override string GetRuntimeReader(TargetPlatform targetPlatform)
  14. {
  15. return typeof(TiledMapTilesetReader).AssemblyQualifiedName;
  16. }
  17. public override string GetRuntimeType(TargetPlatform targetPlatform)
  18. {
  19. return typeof(TiledMapTileset).AssemblyQualifiedName;
  20. }
  21. protected override void Write(ContentWriter writer, TiledMapTilesetContentItem contentItem)
  22. {
  23. try
  24. {
  25. WriteTileset(writer, contentItem.Data, contentItem);
  26. }
  27. catch (Exception ex)
  28. {
  29. ContentLogger.Logger.LogImportantMessage(ex.StackTrace);
  30. throw;
  31. }
  32. }
  33. public static void WriteTileset(ContentWriter writer, TiledMapTilesetContent tileset, IExternalReferenceRepository externalReferenceRepository)
  34. {
  35. var externalReference = externalReferenceRepository.GetExternalReference<Texture2DContent>(tileset.Image?.Source);
  36. writer.WriteExternalReference(externalReference);
  37. writer.Write(tileset.Class ?? tileset.Type ?? string.Empty);
  38. writer.Write(tileset.TileWidth);
  39. writer.Write(tileset.TileHeight);
  40. writer.Write(tileset.TileCount);
  41. writer.Write(tileset.Spacing);
  42. writer.Write(tileset.Margin);
  43. writer.Write(tileset.Columns);
  44. writer.Write(tileset.Tiles.Count);
  45. foreach (var tilesetTile in tileset.Tiles)
  46. WriteTilesetTile(writer, tilesetTile, externalReferenceRepository);
  47. writer.WriteTiledMapProperties(tileset.Properties);
  48. }
  49. private static void WriteTilesetTile(ContentWriter writer, TiledMapTilesetTileContent tilesetTile,
  50. IExternalReferenceRepository externalReferenceRepository)
  51. {
  52. var externalReference = externalReferenceRepository.GetExternalReference<Texture2DContent>(tilesetTile.Image?.Source);
  53. writer.WriteExternalReference(externalReference);
  54. writer.Write(tilesetTile.LocalIdentifier);
  55. writer.Write(tilesetTile.Type);
  56. writer.Write(tilesetTile.Frames.Count);
  57. writer.Write(tilesetTile.Objects.Count);
  58. foreach (var @object in tilesetTile.Objects)
  59. WriteObject(writer, @object);
  60. foreach (var frame in tilesetTile.Frames)
  61. {
  62. writer.Write(frame.TileIdentifier);
  63. writer.Write(frame.Duration);
  64. }
  65. writer.WriteTiledMapProperties(tilesetTile.Properties);
  66. }
  67. private static void WriteObject(ContentWriter writer, TiledMapObjectContent @object)
  68. {
  69. var type = GetObjectType(@object);
  70. writer.Write((byte)type);
  71. writer.Write(@object.Identifier);
  72. writer.Write(@object.Name ?? string.Empty);
  73. writer.Write(@object.Class ?? @object.Type ?? string.Empty);
  74. writer.Write(@object.X);
  75. writer.Write(@object.Y);
  76. writer.Write(@object.Width);
  77. writer.Write(@object.Height);
  78. writer.Write(@object.Rotation);
  79. writer.Write(@object.Visible);
  80. writer.WriteTiledMapProperties(@object.Properties);
  81. switch (type)
  82. {
  83. case TiledMapObjectType.Rectangle:
  84. case TiledMapObjectType.Ellipse:
  85. break;
  86. case TiledMapObjectType.Tile:
  87. writer.Write(@object.GlobalIdentifier);
  88. break;
  89. case TiledMapObjectType.Polygon:
  90. WritePolyPoints(writer, @object.Polygon.Points);
  91. break;
  92. case TiledMapObjectType.Polyline:
  93. WritePolyPoints(writer, @object.Polyline.Points);
  94. break;
  95. default:
  96. throw new ArgumentOutOfRangeException();
  97. }
  98. }
  99. // ReSharper disable once SuggestBaseTypeForParameter
  100. private static void WritePolyPoints(ContentWriter writer, string @string)
  101. {
  102. var stringPoints = @string.Split(' ');
  103. writer.Write(stringPoints.Length);
  104. foreach (var stringPoint in stringPoints)
  105. {
  106. var xy = stringPoint.Split(',');
  107. var x = float.Parse(xy[0], CultureInfo.InvariantCulture.NumberFormat);
  108. writer.Write(x);
  109. var y = float.Parse(xy[1], CultureInfo.InvariantCulture.NumberFormat);
  110. writer.Write(y);
  111. }
  112. }
  113. public static TiledMapObjectType GetObjectType(TiledMapObjectContent content)
  114. {
  115. if (content.GlobalIdentifier > 0)
  116. return TiledMapObjectType.Tile;
  117. if (content.Ellipse != null)
  118. return TiledMapObjectType.Ellipse;
  119. if (content.Polygon != null)
  120. return TiledMapObjectType.Polygon;
  121. // ReSharper disable once ConvertIfStatementToReturnStatement
  122. if (content.Polyline != null)
  123. return TiledMapObjectType.Polyline;
  124. return TiledMapObjectType.Rectangle;
  125. }
  126. }
  127. }