| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- using System;
- using System.Globalization;
- using Microsoft.Xna.Framework.Content.Pipeline;
- using Microsoft.Xna.Framework.Content.Pipeline.Graphics;
- using Microsoft.Xna.Framework.Content.Pipeline.Serialization.Compiler;
- using MonoGame.Extended.Content.Tiled;
- using MonoGame.Extended.Tiled;
- namespace MonoGame.Extended.Content.Pipeline.Tiled
- {
- [ContentTypeWriter]
- public class TiledMapTilesetWriter : ContentTypeWriter<TiledMapTilesetContentItem>
- {
- public override string GetRuntimeReader(TargetPlatform targetPlatform)
- {
- return typeof(TiledMapTilesetReader).AssemblyQualifiedName;
- }
- public override string GetRuntimeType(TargetPlatform targetPlatform)
- {
- return typeof(TiledMapTileset).AssemblyQualifiedName;
- }
- protected override void Write(ContentWriter writer, TiledMapTilesetContentItem contentItem)
- {
- try
- {
- WriteTileset(writer, contentItem.Data, contentItem);
- }
- catch (Exception ex)
- {
- ContentLogger.Logger.LogImportantMessage(ex.StackTrace);
- throw;
- }
- }
- public static void WriteTileset(ContentWriter writer, TiledMapTilesetContent tileset, IExternalReferenceRepository externalReferenceRepository)
- {
- var externalReference = externalReferenceRepository.GetExternalReference<Texture2DContent>(tileset.Image?.Source);
- writer.WriteExternalReference(externalReference);
- writer.Write(tileset.Class ?? tileset.Type ?? string.Empty);
- writer.Write(tileset.TileWidth);
- writer.Write(tileset.TileHeight);
- writer.Write(tileset.TileCount);
- writer.Write(tileset.Spacing);
- writer.Write(tileset.Margin);
- writer.Write(tileset.Columns);
- writer.Write(tileset.Tiles.Count);
- foreach (var tilesetTile in tileset.Tiles)
- WriteTilesetTile(writer, tilesetTile, externalReferenceRepository);
- writer.WriteTiledMapProperties(tileset.Properties);
- }
- private static void WriteTilesetTile(ContentWriter writer, TiledMapTilesetTileContent tilesetTile,
- IExternalReferenceRepository externalReferenceRepository)
- {
- var externalReference = externalReferenceRepository.GetExternalReference<Texture2DContent>(tilesetTile.Image?.Source);
- writer.WriteExternalReference(externalReference);
- writer.Write(tilesetTile.LocalIdentifier);
- writer.Write(tilesetTile.Type);
- writer.Write(tilesetTile.Frames.Count);
- writer.Write(tilesetTile.Objects.Count);
- foreach (var @object in tilesetTile.Objects)
- WriteObject(writer, @object);
- foreach (var frame in tilesetTile.Frames)
- {
- writer.Write(frame.TileIdentifier);
- writer.Write(frame.Duration);
- }
- writer.WriteTiledMapProperties(tilesetTile.Properties);
- }
- private static void WriteObject(ContentWriter writer, TiledMapObjectContent @object)
- {
- var type = GetObjectType(@object);
- writer.Write((byte)type);
- writer.Write(@object.Identifier);
- writer.Write(@object.Name ?? string.Empty);
- writer.Write(@object.Class ?? @object.Type ?? string.Empty);
- writer.Write(@object.X);
- writer.Write(@object.Y);
- writer.Write(@object.Width);
- writer.Write(@object.Height);
- writer.Write(@object.Rotation);
- writer.Write(@object.Visible);
- writer.WriteTiledMapProperties(@object.Properties);
- switch (type)
- {
- case TiledMapObjectType.Rectangle:
- case TiledMapObjectType.Ellipse:
- break;
- case TiledMapObjectType.Tile:
- writer.Write(@object.GlobalIdentifier);
- break;
- case TiledMapObjectType.Polygon:
- WritePolyPoints(writer, @object.Polygon.Points);
- break;
- case TiledMapObjectType.Polyline:
- WritePolyPoints(writer, @object.Polyline.Points);
- break;
- default:
- throw new ArgumentOutOfRangeException();
- }
- }
- // ReSharper disable once SuggestBaseTypeForParameter
- private static void WritePolyPoints(ContentWriter writer, string @string)
- {
- var stringPoints = @string.Split(' ');
- writer.Write(stringPoints.Length);
- foreach (var stringPoint in stringPoints)
- {
- var xy = stringPoint.Split(',');
- var x = float.Parse(xy[0], CultureInfo.InvariantCulture.NumberFormat);
- writer.Write(x);
- var y = float.Parse(xy[1], CultureInfo.InvariantCulture.NumberFormat);
- writer.Write(y);
- }
- }
- public static TiledMapObjectType GetObjectType(TiledMapObjectContent content)
- {
- if (content.GlobalIdentifier > 0)
- return TiledMapObjectType.Tile;
- if (content.Ellipse != null)
- return TiledMapObjectType.Ellipse;
- if (content.Polygon != null)
- return TiledMapObjectType.Polygon;
- // ReSharper disable once ConvertIfStatementToReturnStatement
- if (content.Polyline != null)
- return TiledMapObjectType.Polyline;
- return TiledMapObjectType.Rectangle;
- }
- }
- }
|