add LdtkFieldInstance and LdtkEntityMap classes; update LdtkSceneBuilder to support entity mapping

This commit is contained in:
2025-09-23 02:21:18 +02:00
parent 22271e741d
commit 43e5bfcdce
11 changed files with 278 additions and 10 deletions

View File

@@ -1,4 +1,6 @@
using System;
using System.Linq;
using System.Text.Json;
using CSharpLdtkImporter.Models;
using Godot;
@@ -8,12 +10,14 @@ public class LdtkSceneBuilder
{
private readonly LdtkData _ldtkData;
private readonly string _basePath;
private readonly LdtkEntityMap _entityMap;
private readonly Godot.Collections.Dictionary<int, TileSet> _tileSetCache = new();
public LdtkSceneBuilder(LdtkData ldtkData, string sourceFile)
public LdtkSceneBuilder(LdtkData ldtkData, string sourceFile, LdtkEntityMap entityMap)
{
_ldtkData = ldtkData;
_basePath = sourceFile.GetBaseDir();
_entityMap = entityMap;
}
public Node2D BuildLdtkProjectRoot()
@@ -94,17 +98,57 @@ public class LdtkSceneBuilder
private Node2D BuildEntityLayer(LdtkLayerInstance layer)
{
var entityLayerRoot = new Node2D { Name = layer.Identifier };
foreach (var entity in layer.EntityInstances)
{
var marker = new Marker2D
Node2D instance = null;
GD.Print($"EntityMap keys: {string.Join(", ", _entityMap?.EntitySceneMap.Keys ?? Array.Empty<string>())}");
GD.Print($"Entity Identifier: {entity.Identifier}");
GD.Print($"Is Entity Mapped: {_entityMap?.EntitySceneMap.ContainsKey(entity.Identifier)}");
if (_entityMap?.EntitySceneMap.TryGetValue(entity.Identifier, out var packedScene) == true &&
packedScene != null)
{
Name = entity.Identifier,
Position = new Vector2(entity.Px[0], entity.Px[1])
};
entityLayerRoot.AddChild(marker);
GD.Print($"Instantiating entity '{entity.Identifier}' from mapped scene.");
instance = packedScene.Instantiate<Node2D>();
}
else
{
GD.Print($"Defaulting to Marker2D for unmapped entity '{entity.Identifier}'.");
instance = new Marker2D();
}
instance.Name = entity.Identifier;
instance.Position = new Vector2(entity.Px[0], entity.Px[1]);
foreach (var field in entity.FieldInstances)
{
instance.SetMeta(field.Identifier, ConvertJsonElementToVariant(field.Value));
}
entityLayerRoot.AddChild(instance);
}
return entityLayerRoot;
}
private static Variant ConvertJsonElementToVariant(JsonElement element)
{
return element.ValueKind switch
{
JsonValueKind.String => element.GetString(),
JsonValueKind.Number => element.GetDouble(),
JsonValueKind.True => true,
JsonValueKind.False => false,
JsonValueKind.Null => default,
// For LDTK points (which are objects) or arrays, we can serialize them back to a JSON string.
// A more advanced implementation could convert these to Vector2 or Array types.
JsonValueKind.Object => Json.Stringify(Json.ParseString(element.GetRawText())),
JsonValueKind.Array => Json.Stringify(Json.ParseString(element.GetRawText())),
_ => default
};
}
private TileSet GetOrCreateTileSet(int tilesetDefUid)
{