mirror of
https://github.com/AlexMacocian/MonoGame.Extended.git
synced 2026-07-15 15:09:29 +00:00
add support for class (nested) properties
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user