Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / editorTileImage / EditorTileImagePanel.cs
@小李xl 小李xl on 21 Jan 2024 3 KB TileSet导入纹理设置
using Godot;

namespace UI.EditorTileImage;

public partial class EditorTileImagePanel : EditorTileImage
{
    /// <summary>
    /// 起始X
    /// </summary>
    public int StartXValue { get; private set; }
    /// <summary>
    /// 起始Y
    /// </summary>
    public int StartYValue { get; private set; }
    /// <summary>
    /// 间距X
    /// </summary>
    public int OffsetXValue { get; private set; }
    /// <summary>
    /// 间距Y
    /// </summary>
    public int OffsetYValue { get; private set; }
    /// <summary>
    /// 横轴数量
    /// </summary>
    public int HCountValue { get; private set; }
    /// <summary>
    /// 纵轴数量
    /// </summary>
    public int VCountValue { get; private set; }
    /// <summary>
    /// 纹理大小
    /// </summary>
    public Vector2I ImageSize { get; private set; }
    /// <summary>
    /// 使用的Image对象
    /// </summary>
    public Image UseImage { get; private set; }
    
    private ImageTexture _texture;
    
    public override void OnCreateUi()
    {
        S_StartX.Instance.ValueChanged += (v) =>
        {
            StartXValue = (int)v;
            RefreshHVMaxCount();
        };
        S_StartY.Instance.ValueChanged += (v) =>
        {
            StartYValue = (int)v;
            RefreshHVMaxCount();
        };
        S_OffsetX.Instance.ValueChanged += (v) =>
        {
            OffsetXValue = (int)v;
            RefreshHVMaxCount();
        };
        S_OffsetY.Instance.ValueChanged += (v) =>
        {
            OffsetYValue = (int)v;
            RefreshHVMaxCount();
        };
        S_HCount.Instance.ValueChanged += (v) =>
        {
            HCountValue = (int)v;
        };
        S_VCount.Instance.ValueChanged += (v) =>
        {
            VCountValue = (int)v;
        };
    }

    public override void OnDestroyUi()
    {
        if (UseImage != null)
        {
            UseImage.Dispose();
            UseImage = null;
        }

        if (_texture != null)
        {
            _texture.Dispose();
            _texture = null;
        }
    }

    /// <summary>
    /// 初始化Ui数据
    /// </summary>
    public void InitData(Image image)
    {
        UseImage = image;
        ImageSize = image.GetSize();
        _texture = ImageTexture.CreateFromImage(image);
        S_TileSprite.Instance.Texture = _texture;
        S_Bg.Instance.DoFocus();
        S_TextureRoot.Instance.Size = image.GetSize();

        RefreshHVMaxCount();
        S_HCount.Instance.Value = S_HCount.Instance.MaxValue;
        S_VCount.Instance.Value = S_VCount.Instance.MaxValue;
    }

    /// <summary>
    /// 获取处理后的图像
    /// </summary>
    public Image GetImage()
    {
        var image = Image.Create(HCountValue * GameConfig.TileCellSize, VCountValue * GameConfig.TileCellSize, false, Image.Format.Rgba8);
        var start = new Vector2I(StartXValue, StartYValue);
        for (int i = 0; i < HCountValue; i++)
        {
            for (int j = 0; j < VCountValue; j++)
            {
                var offset = new Vector2I(i * (OffsetXValue + GameConfig.TileCellSize), j * (OffsetYValue + GameConfig.TileCellSize));
                image.BlitRect(UseImage,
                    new Rect2I(
                        start + offset,
                        GameConfig.TileCellSizeVector2I
                    ),
                    new Vector2I(i * GameConfig.TileCellSize, j * GameConfig.TileCellSize)
                );
            }
        }

        return image;
    }
    
    //更新最大计数的水平和垂直方向的值
    private void RefreshHVMaxCount()
    {
        var hv = Mathf.FloorToInt(((float)ImageSize.X - StartXValue + OffsetXValue) / (GameConfig.TileCellSize + OffsetXValue));
        var vv = Mathf.FloorToInt(((float)ImageSize.Y - StartYValue + OffsetYValue) / (GameConfig.TileCellSize + OffsetYValue));
        S_HCount.Instance.MaxValue = hv;
        S_VCount.Instance.MaxValue = vv;
    }
}