add support for class (nested) properties

This commit is contained in:
KatDevsGames
2023-09-19 21:27:44 -05:00
parent 20fb26d6c1
commit fba908f454
7 changed files with 81 additions and 36 deletions
@@ -9,11 +9,17 @@ namespace MonoGame.Extended.Content.Pipeline.Tiled
// ReSharper disable once SuggestBaseTypeForParameter
public static void WriteTiledMapProperties(this ContentWriter writer, IReadOnlyCollection<TiledMapPropertyContent> value)
{
if (value == null)
{
writer.Write(0);
return;
}
writer.Write(value.Count);
foreach (var property in value)
{
writer.Write(property.Name);
writer.Write(property.Value);
writer.Write(property.Value ?? string.Empty);
WriteTiledMapProperties(writer, property.Properties);
}
}
}
@@ -0,0 +1,20 @@
using Microsoft.Xna.Framework.Content;
namespace MonoGame.Extended.Tiled
{
public static class ContentReaderExtensions
{
public static void ReadTiledMapProperties(this ContentReader reader, TiledMapProperties properties)
{
var count = reader.ReadInt32();
for (var i = 0; i < count; i++)
{
var key = reader.ReadString();
var value = new TiledMapPropertyValue(reader.ReadString());
ReadTiledMapProperties(reader, value.Properties);
properties[key] = value;
}
}
}
}
@@ -1,3 +1,4 @@
using System.Collections.Generic;
using System.Xml.Serialization;
namespace MonoGame.Extended.Tiled.Serialization
@@ -13,6 +14,10 @@ namespace MonoGame.Extended.Tiled.Serialization
[XmlText]
public string ValueBody { get; set; }
[XmlArray("properties")]
[XmlArrayItem("property")]
public List<TiledMapPropertyContent> Properties { get; set; }
public string Value => ValueAttribute ?? ValueBody;
public override string ToString()
@@ -20,4 +25,4 @@ namespace MonoGame.Extended.Tiled.Serialization
return $"{Name}: {Value}";
}
}
}
}
@@ -2,7 +2,13 @@
namespace MonoGame.Extended.Tiled
{
public class TiledMapProperties : Dictionary<string, string>
public class TiledMapProperties : Dictionary<string, TiledMapPropertyValue>
{
public bool TryGetValue(string key, out string value)
{
bool result = TryGetValue(key, out TiledMapPropertyValue tmpVal);
value = result ? null : tmpVal.Value;
return result;
}
}
}
}
@@ -0,0 +1,32 @@
namespace MonoGame.Extended.Tiled;
public class TiledMapPropertyValue
{
public string Value { get; }
public TiledMapProperties Properties;
public TiledMapPropertyValue()
{
Value = string.Empty;
Properties = new();
}
public TiledMapPropertyValue(string value)
{
Value = value;
Properties = new();
}
public TiledMapPropertyValue(TiledMapProperties properties)
{
Value = string.Empty;
Properties = properties;
}
public override string ToString() => Value;
//public static implicit operator TiledMapPropertyValue(string value) => new(value);
public static implicit operator string(TiledMapPropertyValue value) => value.Value;
public static implicit operator TiledMapProperties(TiledMapPropertyValue value) => value.Properties;
}
@@ -16,24 +16,12 @@ namespace MonoGame.Extended.Tiled
return existingInstance;
var map = ReadTiledMap(reader);
ReadProperties(reader, map.Properties);
reader.ReadTiledMapProperties(map.Properties);
ReadTilesets(reader, map);
ReadLayers(reader, map);
return map;
}
private static void ReadProperties(ContentReader reader, TiledMapProperties properties)
{
var count = reader.ReadInt32();
for (var i = 0; i < count; i++)
{
var key = reader.ReadString();
var value = reader.ReadString();
properties[key] = value;
}
}
private static TiledMap ReadTiledMap(ContentReader reader)
{
var name = reader.AssetName;
@@ -98,7 +86,7 @@ namespace MonoGame.Extended.Tiled
var parallaxFactor = new Vector2(parallaxX, parallaxY);
var properties = new TiledMapProperties();
ReadProperties(reader, properties);
reader.ReadTiledMapProperties(properties);
TiledMapLayer layer;
@@ -154,7 +142,7 @@ namespace MonoGame.Extended.Tiled
var properties = new TiledMapProperties();
const float opacity = 1.0f;
ReadProperties(reader, properties);
reader.ReadTiledMapProperties(properties);
TiledMapObject mapObject;
@@ -38,12 +38,12 @@ namespace MonoGame.Extended.Tiled
new TiledMapTilesetTile(localTileIdentifier, type, objects))
: ReadTiledMapTilesetTile(reader, tileset, objects =>
new TiledMapTilesetAnimatedTile(localTileIdentifier, ReadTiledMapTilesetAnimationFrames(reader, tileset, animationFramesCount), type, objects));
ReadProperties(reader, tilesetTile.Properties);
reader.ReadTiledMapProperties(tilesetTile.Properties);
tileset.Tiles.Add(tilesetTile);
}
ReadProperties(reader, tileset.Properties);
reader.ReadTiledMapProperties(tileset.Properties);
return tileset;
}
@@ -88,7 +88,7 @@ namespace MonoGame.Extended.Tiled
var properties = new TiledMapProperties();
const float opacity = 1.0f;
ReadProperties(reader, properties);
reader.ReadTiledMapProperties(properties);
TiledMapObject mapObject;
@@ -134,17 +134,5 @@ namespace MonoGame.Extended.Tiled
return points;
}
private static void ReadProperties(ContentReader reader, TiledMapProperties properties)
{
var count = reader.ReadInt32();
for (var i = 0; i < count; i++)
{
var key = reader.ReadString();
var value = reader.ReadString();
properties[key] = value;
}
}
}
}