Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / tileSetEditorCombination / leftBottom / TileEditArea.cs
@小李xl 小李xl on 16 Dec 2023 3 KB 组合图块, 开发中
using System.Collections.Generic;
using Godot;

namespace UI.TileSetEditorCombination;

public partial class TileEditArea : GridBg<TileSetEditorCombination.LeftBottomBg>
{
    private UiGrid<TileSetEditorCombination.MaskRect, bool> _maskGrid;
    private readonly HashSet<Vector2I> _useMask = new HashSet<Vector2I>();
    
    public override void SetUiNode(IUiNode uiNode)
    {
        base.SetUiNode(uiNode);
        Grid = UiNode.L_Grid.Instance;
        ContainerRoot = UiNode.L_TileTexture.Instance;
        
        var maskBrush = UiNode.L_TileTexture.L_MaskBrush.Instance;
        maskBrush.TileTexture = UiNode.L_TileTexture.Instance;
        maskBrush.TileEditArea = this;

        _maskGrid = new UiGrid<TileSetEditorCombination.MaskRect, bool>(UiNode.L_TileTexture.L_MaskRoot.L_MaskRect, typeof(MaskRectCell));
        _maskGrid.SetCellOffset(Vector2I.Zero);
        _maskGrid.GridContainer.MouseFilter = MouseFilterEnum.Ignore;
    }

    public override void OnDestroy()
    {
        base.OnDestroy();
        _maskGrid.Destroy();
    }

    public override void _Process(double delta)
    {
        //Ui未打开
        if (!UiNode.UiPanel.IsOpen)
        {
            return;
        }

        if (Input.IsMouseButtonPressed(MouseButton.Left)) //左键选中
        {
            if (this.IsMouseInRect())
            {
                var cellPosition = GetMouseCellPosition();
                if (UiNode.UiPanel.EditorPanel.IsCellPositionInTexture(cellPosition))
                {
                    if (Input.IsActionJustPressed("mouse_left")) //刚按下, 清除之前的选中
                    {
                        OnRemoveCell();
                    }
                    OnSelectCell(cellPosition);
                }
            }
        }
    }

    /// <summary>
    /// 选中Cell图块
    /// </summary>
    private void OnSelectCell(Vector2I cell)
    {
        if (!_useMask.Contains(cell))
        {
            var cellIndex = UiNode.UiPanel.EditorPanel.CellPositionToIndex(cell);
            var uiCell = _maskGrid.GetCell(cellIndex);
            if (uiCell != null && !uiCell.Data)
            {
                _useMask.Add(cell);
                uiCell.SetData(true);
                
                EventManager.EmitEvent(EventEnum.OnSelectCombinationCell, cell);
            }
        }
    }

    /// <summary>
    /// 移除选中的Cell图块
    /// </summary>
    private void OnRemoveCell()
    {
        _useMask.Clear();
        var count = _maskGrid.Count;
        for (var i = 0; i < count; i++)
        {
            var uiCell = _maskGrid.GetCell(i);
            if (uiCell.Data)
            {
                uiCell.SetData(false);
            }
        }
        
        EventManager.EmitEvent(EventEnum.OnClearCombinationCell);
    }

    /// <summary>
    /// 改变TileSet纹理
    /// </summary>
    public void OnChangeTileSetTexture(Texture2D texture)
    {
        UiNode.L_TileTexture.Instance.Texture = texture;
        var width = UiNode.UiPanel.EditorPanel.CellHorizontal;
        var height = UiNode.UiPanel.EditorPanel.CellVertical;
        _maskGrid.RemoveAll();
        _useMask.Clear();
        _maskGrid.SetColumns(width);
        for (var i = 0; i < width; i++)
        {
            for (var j = 0; j < height; j++)
            {
                _maskGrid.Add(false);
            }
        }
    }
    
    /// <summary>
    /// 返回鼠标所在的单元格位置, 相对于纹理左上角
    /// </summary>
    public Vector2I GetMouseCellPosition()
    {
        var textureRect = UiNode.L_TileTexture.Instance;
        var pos = textureRect.GetLocalMousePosition() / GameConfig.TileCellSize;
        return pos.AsVector2I();
    }
}