Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / manager / EditorTileSetManager.cs
@小李xl 小李xl on 6 Jan 2024 5 KB 保存TileSet数据完成

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

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

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

    /// <summary>
    /// 将地形掩码存入 TileSetTerrainInfo 中
    /// </summary>
    public static void SetTileSetTerrainBit(TileSetTerrainInfo terrain, int index, byte type, int[] cellData)
    {
        if (type == 1) //顶部墙壁
        {
            switch (index)
            {
                //第一排
                case 0: terrain._000_010_010 = cellData; break;
                case 1: terrain._000_011_010 = cellData; break;
                case 2: terrain._000_111_010 = cellData; break;
                case 3: terrain._000_110_010 = cellData; break;
                
                case 4: terrain._110_111_010 = cellData; break;
                case 5: terrain._000_111_011 = cellData; break;
                case 6: terrain._000_111_110 = cellData; break;
                case 7: terrain._011_111_010 = cellData; break;
                
                case 8: terrain._000_011_011 = cellData; break;
                case 9: terrain._010_111_111 = cellData; break;
                case 10: terrain._000_111_111 = cellData; break;
                case 11: terrain._000_110_110 = cellData; break;
                
                //第二排
                case 12: terrain._010_010_010 = cellData; break;
                case 13: terrain._010_011_010 = cellData; break;
                case 14: terrain._010_111_010 = cellData; break;
                case 15: terrain._010_110_010 = cellData; break;
                
                case 16: terrain._010_011_011 = cellData; break;
                case 17: terrain._011_111_111 = cellData; break;
                case 18: terrain._110_111_111 = cellData; break;
                case 19: terrain._010_110_110 = cellData; break;
                
                case 20: terrain._011_011_011 = cellData; break;
                case 21: terrain._011_111_110 = cellData; break;
                case 22: break;
                case 23: terrain._110_111_110 = cellData; break;
                
                //第三排
                case 24: terrain._010_010_000 = cellData; break;
                case 25: terrain._010_011_000 = cellData; break;
                case 26: terrain._010_111_000 = cellData; break;
                case 27: terrain._010_110_000 = cellData; break;
                
                case 28: terrain._011_011_010 = cellData; break;
                case 29: terrain._111_111_011 = cellData; break;
                case 30: terrain._111_111_110 = cellData; break;
                case 31: terrain._110_110_010 = cellData; break;
                
                case 32: terrain._011_111_011 = cellData; break;
                case 33: terrain._111_111_111 = cellData; break;
                case 34: terrain._110_111_011 = cellData; break;
                case 35: terrain._110_110_110 = cellData; break;
                
                //第四排
                case 36: terrain._000_010_000 = cellData; break;
                case 37: terrain._000_011_000 = cellData; break;
                case 38: terrain._000_111_000 = cellData; break;
                case 39: terrain._000_110_000 = cellData; break;
                
                case 40: terrain._010_111_110 = cellData; break;
                case 41: terrain._011_111_000 = cellData; break;
                case 42: terrain._110_111_000 = cellData; break;
                case 43: terrain._010_111_011 = cellData; break;
                
                case 44: terrain._011_011_000 = cellData; break;
                case 45: terrain._111_111_000 = cellData; break;
                case 46: terrain._111_111_010 = cellData; break;
                case 47: terrain._110_110_000 = cellData; break;
            }
        }
        else if (type == 2) //侧方墙壁
        {
            switch (index)
            {
                case 0: terrain._vs = cellData; break;
                case 1: terrain._vl = cellData; break;
                case 2: terrain._vc = cellData; break;
                case 3: terrain._vr = cellData; break;
            }
        }
        else if (type == 3) //地板
        {
            terrain._f = cellData;
        }
    }

    //保存图块集
    private static void OnTileSetSave(object o)
    {
        if (o is TileSetInfo tileSetInfo)
        {
            var dir = CustomMapPath + tileSetInfo.Name;
            if (Directory.Exists(dir))
            {
                Directory.Delete(dir, true);
            }
            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)
                {
                    if (sourceInfo.IsOverWriteImage())
                    {
                        var image = sourceInfo.GetSourceImage();
                        image.SavePng(dir + "/" + sourceInfo.Name + ".png");
                    }
                }
            }
        }
    }
}