Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / tileSetEditorTerrain / up / TerrainCell.cs
using Godot;

namespace UI.TileSetEditorTerrain;

public class TerrainCell : UiCell<TileSetEditorTerrain.RightCell, byte>
{
    /// <summary>
    /// 已经赋值并连接的MaskCell
    /// </summary>
    public MaskCell ConnectMaskCell { get; set; }
    
    /// <summary>
    /// 鼠标是否悬停
    /// </summary>
    public bool Hover { get; set; }
    
    /// <summary>
    /// 是否放置了图块
    /// </summary>
    public bool IsPutDownTexture { get; private set; }
    
    /// <summary>
    /// 图块在 Source 中的位置, 单位: 像素
    /// </summary>
    public Vector2I TextureCell { get; private set; }
    
    private TileSetEditorTerrainPanel _panel;
    
    public override void OnInit()
    {
        _panel = CellNode.UiPanel;
        CellNode.Instance.GuiInput += OnGuiInput;
        CellNode.Instance.Draw += OnDraw;
    }

    /// <summary>
    /// 拖拽放置Cell
    /// </summary>
    public bool OnDropCell(MaskCell maskCell)
    {
        if (CellNode.Instance.IsMouseInRect())
        {
            OnDropData(maskCell);
            return true;
        }

        return false;
    }

    public override void Process(float delta)
    {
        CellNode.Instance.QueueRedraw();
    }

    private void OnGuiInput(InputEvent @event)
    {
        if (IsPutDownTexture && @event is InputEventMouseButton mouseEvent)
        {
            if (mouseEvent.ButtonIndex == MouseButton.Right && mouseEvent.Pressed) //右键擦除图块
            {
                CellNode.Instance.AcceptEvent();
                var flag = IsPutDownTexture;
                ClearCell();
                if (flag)
                {
                    ClearTerrainBitData();
                    if (ConnectMaskCell != null)
                    {
                        ConnectMaskCell.SetConnectTerrainCell(null);
                    }
                }
            }
        }
    }

    /// <summary>
    /// 设置选择的Cell
    /// </summary>
    public void SetCell(Rect2I rect)
    {
        TextureCell = rect.Position;
        var sprite2D = CellNode.L_CellTexture.Instance;
        sprite2D.Texture = _panel.EditorPanel.Texture;
        sprite2D.RegionEnabled = true;
        sprite2D.RegionRect = rect;
        IsPutDownTexture = true;
    }

    /// <summary>
    /// 清除选中的cell
    /// </summary>
    public void ClearCell()
    {
        CellNode.L_CellTexture.Instance.Texture = null;
        IsPutDownTexture = false;
    }

    /// <summary>
    /// 清除存储的地形掩码数据
    /// </summary>
    public void ClearTerrainBitData()
    {
        SetTerrainBitData(null);
    }

    private void OnDropData(MaskCell maskCell)
    {
        SetCell(maskCell.Data);
        SetTerrainBitData(new []{ TextureCell.X, TextureCell.Y });
        if (ConnectMaskCell != maskCell)
        {
            if (ConnectMaskCell != null)
            {
                ConnectMaskCell.SetConnectTerrainCell(null);
            }
            maskCell.SetConnectTerrainCell(this);
        }
    }
    
    private void SetTerrainBitData(int[] cellData)
    {
        if (cellData == null)
        {
            _panel.CurrTerrain?.RemoveTerrainCell(Index, Data);
        }
        else
        {
            _panel.CurrTerrain?.SetTerrainCell(Index, Data, cellData);
        }

        EventManager.EmitEvent(EventEnum.OnTileSetDirty);
    }
    
    private void OnDraw()
    {
        if (ConnectMaskCell != null && (Hover || ConnectMaskCell.Hover))
        {
            CellNode.Instance.DrawRect(
                new Rect2(Vector2.Zero, CellNode.Instance.Size),
                new Color(0, 1, 0, 0.2f)
            );
        }
    }
}