From 247f9294afafb3569c62e97fe6a5cc14d0d657c8 Mon Sep 17 00:00:00 2001 From: Daniel Cronqvist Date: Tue, 3 Sep 2024 22:52:26 +0200 Subject: [PATCH] Simplified loader a bit and added more docs --- docs/docs/quickstart.md | 29 +++++++---- .../Serialization/LoaderTests.cs | 1 + src/DotTiled/Serialization/Loader.cs | 52 ++++++++++--------- 3 files changed, 48 insertions(+), 34 deletions(-) diff --git a/docs/docs/quickstart.md b/docs/docs/quickstart.md index 4092730..c43031b 100644 --- a/docs/docs/quickstart.md +++ b/docs/docs/quickstart.md @@ -6,13 +6,19 @@ Install DotTiled from NuGet: dotnet add package DotTiled ``` +Use the `DotTiled` namespace (if you want). + +```csharp +using DotTiled; +``` + +Or fully qualify all `DotTiled` types e.g. `DotTiled.Loader`. + ## Loading a map from the file system This will create a loader that will load files from the underlying file system using . It will also be configured to use an in-memory cache to avoid loading the same tileset or template multiple times using . ```csharp -using DotTiled; - var loader = Loader.Default(); var map = loader.LoadMap("path/to/map.tmx"); ``` @@ -22,8 +28,6 @@ var map = loader.LoadMap("path/to/map.tmx"); If you want to load resources (maps, tilesets, templates) from a different source than the underlying file system, you can override the that is being used with your own implementation of . ```csharp -using DotTiled; - var loader = Loader.DefaultWith( resourceReader: new MyCustomResourceReader()); var map = loader.LoadMap("path/to/map.tmx"); @@ -34,8 +38,6 @@ var map = loader.LoadMap("path/to/map.tmx"); Similarly, you can override the that is being used with your own implementation of . ```csharp -using DotTiled; - var loader = Loader.DefaultWith( resourceReader: new MyCustomResourceReader(), resourceCache: new MyCustomResourceCache()); @@ -47,12 +49,21 @@ var map = loader.LoadMap("path/to/map.tmx"); If you have custom types in your map, you can provide any `IEnumerable` to the loader. This will allow the loader to deserialize the custom types in your map. ```csharp -using DotTiled; - var monsterSpawnerDef = new CustomClassDefinition { ... }; -var chestDef = new CustomClassDefinition { ... }; +var chestDef = new CustomClassDefinition +{ + Name = "Chest", + UseAs = CustomClassUseAs.All, + Members = [ + new IntProperty { Name = "coins", Value = 0 }, + new BoolProperty { Name = "locked", Value = true } + ] +}; var loader = Loader.DefaultWith( customTypeDefinitions: [monsterSpawnerDef, chestDef]); var map = loader.LoadMap("path/to/map.tmx"); + +var chest = map.GetProperty("chest").Value; +var coinsToSpawn = chest.GetProperty("coins").Value; ``` \ No newline at end of file diff --git a/src/DotTiled.Tests/Serialization/LoaderTests.cs b/src/DotTiled.Tests/Serialization/LoaderTests.cs index 41fa38b..4706445 100644 --- a/src/DotTiled.Tests/Serialization/LoaderTests.cs +++ b/src/DotTiled.Tests/Serialization/LoaderTests.cs @@ -1,5 +1,6 @@ using System.Numerics; using System.Runtime.CompilerServices; +using DotTiled.Serialization; using NSubstitute; namespace DotTiled.Tests; diff --git a/src/DotTiled/Serialization/Loader.cs b/src/DotTiled/Serialization/Loader.cs index 7651c3e..8a01baf 100644 --- a/src/DotTiled/Serialization/Loader.cs +++ b/src/DotTiled/Serialization/Loader.cs @@ -79,39 +79,41 @@ public class Loader return tilesetReader.ReadTileset(); } - private Func GetTilesetResolver(string basePath) + private Func GetResolverFunc( + string basePath, + Func> cacheResolver, + Action cacheInsert, + Func resolveFromContent) { return source => { - var tilesetPath = Path.Combine(basePath, source); - var cachedTileset = _resourceCache.GetTileset(source); - if (cachedTileset.HasValue) - return cachedTileset.Value; + var resourcePath = Path.Combine(basePath, source); + var cachedResource = cacheResolver(resourcePath); + if (cachedResource.HasValue) + return cachedResource.Value; - string tilesetContent = _resourceReader.Read(tilesetPath); - using var tilesetReader = new TilesetReader(tilesetContent, GetTilesetResolver(basePath), GetTemplateResolver(basePath), CustomTypeResolver); - var tileset = tilesetReader.ReadTileset(); - _resourceCache.InsertTileset(source, tileset); - return tileset; + string tilesetContent = _resourceReader.Read(resourcePath); + var resource = resolveFromContent(tilesetContent); + cacheInsert(resourcePath, resource); + return resource; }; } - private Func GetTemplateResolver(string basePath) - { - return source => - { - var templatePath = Path.Combine(basePath, source); - var cachedTemplate = _resourceCache.GetTemplate(source); - if (cachedTemplate.HasValue) - return cachedTemplate.Value; + private Func GetTilesetResolver(string basePath) => + GetResolverFunc(basePath, _resourceCache.GetTileset, _resourceCache.InsertTileset, + tilesetContent => + { + using var tilesetReader = new TilesetReader(tilesetContent, GetTilesetResolver(basePath), GetTemplateResolver(basePath), CustomTypeResolver); + return tilesetReader.ReadTileset(); + }); - string templateContent = _resourceReader.Read(templatePath); - using var templateReader = new TemplateReader(templateContent, GetTilesetResolver(basePath), GetTemplateResolver(basePath), CustomTypeResolver); - var template = templateReader.ReadTemplate(); - _resourceCache.InsertTemplate(source, template); - return template; - }; - } + private Func GetTemplateResolver(string basePath) => + GetResolverFunc