From 5193ab5b61a464478571cbc1f7e0e00cfd3d7893 Mon Sep 17 00:00:00 2001 From: Daniel Cronqvist Date: Sat, 27 Jul 2024 23:53:05 +0200 Subject: [PATCH] Add Group to Model and to TmxSerializer --- DotTiled/Model/Layers/BaseLayer.cs | 2 - DotTiled/Model/Layers/Group.cs | 11 +++++ DotTiled/Model/Layers/ImageLayer.cs | 2 + DotTiled/Model/Layers/ObjectLayer.cs | 2 + DotTiled/Model/Layers/TileLayer.cs | 2 + DotTiled/TmxSerializer/TmxSerializer.Map.cs | 1 + .../TmxSerializer/TmxSerializer.TileLayer.cs | 43 +++++++++++++++++++ 7 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 DotTiled/Model/Layers/Group.cs diff --git a/DotTiled/Model/Layers/BaseLayer.cs b/DotTiled/Model/Layers/BaseLayer.cs index 950a6f1..0f10a95 100644 --- a/DotTiled/Model/Layers/BaseLayer.cs +++ b/DotTiled/Model/Layers/BaseLayer.cs @@ -8,8 +8,6 @@ public abstract class BaseLayer public required uint ID { get; set; } public string Name { get; set; } = ""; public string Class { get; set; } = ""; - public uint X { get; set; } = 0; - public uint Y { get; set; } = 0; public float Opacity { get; set; } = 1.0f; public bool Visible { get; set; } = true; public Color? TintColor { get; set; } diff --git a/DotTiled/Model/Layers/Group.cs b/DotTiled/Model/Layers/Group.cs new file mode 100644 index 0000000..f58a83c --- /dev/null +++ b/DotTiled/Model/Layers/Group.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace DotTiled; + +public class Group : BaseLayer +{ + // Uses same attributes as BaseLayer + + // Any number of + public List Layers { get; set; } = []; +} diff --git a/DotTiled/Model/Layers/ImageLayer.cs b/DotTiled/Model/Layers/ImageLayer.cs index 7d0b141..6489c22 100644 --- a/DotTiled/Model/Layers/ImageLayer.cs +++ b/DotTiled/Model/Layers/ImageLayer.cs @@ -3,6 +3,8 @@ namespace DotTiled; public class ImageLayer : BaseLayer { // Attributes + public uint X { get; set; } = 0; + public uint Y { get; set; } = 0; public required bool RepeatX { get; set; } public required bool RepeatY { get; set; } diff --git a/DotTiled/Model/Layers/ObjectLayer.cs b/DotTiled/Model/Layers/ObjectLayer.cs index acf96a5..253b616 100644 --- a/DotTiled/Model/Layers/ObjectLayer.cs +++ b/DotTiled/Model/Layers/ObjectLayer.cs @@ -11,6 +11,8 @@ public enum DrawOrder public class ObjectLayer : BaseLayer { // Attributes + public uint X { get; set; } = 0; + public uint Y { get; set; } = 0; public uint? Width { get; set; } public uint? Height { get; set; } public required Color? Color { get; set; } diff --git a/DotTiled/Model/Layers/TileLayer.cs b/DotTiled/Model/Layers/TileLayer.cs index de4b25d..7692266 100644 --- a/DotTiled/Model/Layers/TileLayer.cs +++ b/DotTiled/Model/Layers/TileLayer.cs @@ -3,6 +3,8 @@ namespace DotTiled; public class TileLayer : BaseLayer { // Attributes + public uint X { get; set; } = 0; + public uint Y { get; set; } = 0; public required uint Width { get; set; } public required uint Height { get; set; } diff --git a/DotTiled/TmxSerializer/TmxSerializer.Map.cs b/DotTiled/TmxSerializer/TmxSerializer.Map.cs index bf3432b..799b217 100644 --- a/DotTiled/TmxSerializer/TmxSerializer.Map.cs +++ b/DotTiled/TmxSerializer/TmxSerializer.Map.cs @@ -69,6 +69,7 @@ public partial class TmxSerializer "layer" => () => layers.Add(ReadTileLayer(r, dataUsesChunks: infinite)), "objectgroup" => () => layers.Add(ReadObjectLayer(r)), "imagelayer" => () => layers.Add(ReadImageLayer(r)), + "group" => () => layers.Add(ReadGroup(r)), _ => r.Skip }); diff --git a/DotTiled/TmxSerializer/TmxSerializer.TileLayer.cs b/DotTiled/TmxSerializer/TmxSerializer.TileLayer.cs index b6853c8..bd23d1f 100644 --- a/DotTiled/TmxSerializer/TmxSerializer.TileLayer.cs +++ b/DotTiled/TmxSerializer/TmxSerializer.TileLayer.cs @@ -102,4 +102,47 @@ public partial class TmxSerializer RepeatY = repeatY }; } + + private Group ReadGroup(XmlReader reader) + { + var id = reader.GetRequiredAttributeParseable("id"); + var name = reader.GetOptionalAttribute("name") ?? ""; + var @class = reader.GetOptionalAttribute("class") ?? ""; + var opacity = reader.GetOptionalAttributeParseable("opacity") ?? 1.0f; + var visible = reader.GetOptionalAttributeParseable("visible") ?? true; + var tintColor = reader.GetOptionalAttributeClass("tintcolor"); + var offsetX = reader.GetOptionalAttributeParseable("offsetx") ?? 0.0f; + var offsetY = reader.GetOptionalAttributeParseable("offsety") ?? 0.0f; + var parallaxX = reader.GetOptionalAttributeParseable("parallaxx") ?? 1.0f; + var parallaxY = reader.GetOptionalAttributeParseable("parallaxy") ?? 1.0f; + + Dictionary? properties = null; + List layers = []; + + reader.ProcessChildren("group", (r, elementName) => elementName switch + { + "properties" => () => Helpers.SetAtMostOnce(ref properties, ReadProperties(r), "Properties"), + "layer" => () => layers.Add(ReadTileLayer(r, dataUsesChunks: false)), + "objectgroup" => () => layers.Add(ReadObjectLayer(r)), + "imagelayer" => () => layers.Add(ReadImageLayer(r)), + "group" => () => layers.Add(ReadGroup(r)), + _ => r.Skip + }); + + return new Group + { + ID = id, + Name = name, + Class = @class, + Opacity = opacity, + Visible = visible, + TintColor = tintColor, + OffsetX = offsetX, + OffsetY = offsetY, + ParallaxX = parallaxX, + ParallaxY = parallaxY, + Properties = properties, + Layers = layers + }; + } }