Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / EditorTileSetManager.cs
@小李xl 小李xl on 8 Jan 2024 2 KB 生成Godot.TileSet, 开发中

using System.IO;
using System.Text.Json;
using Godot;

public static class EditorTileSetManager
{
    
    /// <summary>
    /// 扫描路径
    /// </summary>
    public static string CustomTileSetPath { get; private set; }
    
    private static bool _init;
    
    public static void Init()
    {
        if (_init)
        {
            return;
        }

        _init = true;
#if TOOLS
        CustomTileSetPath = GameConfig.RoomTileSetDir;
#else
        CustomTileSetPath = GameConfig.RoomTileSetDir;
#endif
        EventManager.AddEventListener(EventEnum.OnTileSetSave, OnTileSetSave);
    }

    /// <summary>
    /// 保存TileSetConfig数据
    /// </summary>
    public static void SaveTileSetConfig()
    {
        var options = new JsonSerializerOptions();
        options.WriteIndented = true;
        var jsonText = JsonSerializer.Serialize(GameApplication.Instance.TileSetConfig, options);
        File.WriteAllText(GameConfig.RoomTileSetDir + GameConfig.TileSetConfigFile, jsonText);
    }

    /// <summary>
    /// 保存TileSetInfo数据
    /// </summary>
    public static void SaveTileSetInfo(TileSetInfo tileSetInfo)
    {
        var dir = CustomTileSetPath + tileSetInfo.Name;
        if (Directory.Exists(dir))
        {
            //删除多余文件
            if (tileSetInfo.Sources == null)
            {
                Directory.Delete(dir, true);
                Directory.CreateDirectory(dir);
            }
            else
            {
                var directoryInfo = new DirectoryInfo(dir);
                var fileInfos = directoryInfo.GetFiles();
                foreach (var fileInfo in fileInfos)
                {
                    if (fileInfo.Name.EndsWith(".png"))
                    {
                        var name = fileInfo.Name.Substring(0, fileInfo.Name.Length - 4);
                        if (tileSetInfo.Sources.FindIndex(info => info.Name == name) < 0)
                        {
                            fileInfo.Delete();
                        }
                    }
                }
            }
        }
        else
        {
            Directory.CreateDirectory(dir);
        }

        var path = dir + "/TileSet.json";

        //保存json
        var options = new JsonSerializerOptions();
        options.WriteIndented = true;
        var jsonText = JsonSerializer.Serialize(tileSetInfo, options);
        File.WriteAllText(path, jsonText);

        //保存资源
        if (tileSetInfo.Sources != null)
        {
            foreach (var sourceInfo in tileSetInfo.Sources)
            {
                var image = sourceInfo.GetSourceImage();
                if (image != null)
                {
                    image.SavePng(dir + "/" + sourceInfo.Name + ".png");
                }
            }
        }
    }

    //保存图块集
    private static void OnTileSetSave(object o)
    {
        if (o is TileSetSplit tileSetSplit)
        {
            var tileSetInfo = tileSetSplit.TileSetInfo;
            SaveTileSetInfo(tileSetInfo);
        }
    }
}