Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / common / ui / EditorGridBg.cs
@小李xl 小李xl on 24 Jan 2024 3 KB 代码调整
using Godot;

/// <summary>
/// 通用Ui网格背景组件, 包含可拖拽的容器根节点
/// </summary>
public abstract partial class EditorGridBg : ColorRect, IUiNodeScript
{
    /// <summary>
    /// 可拖拽容器根节点
    /// </summary>
    public Control ContainerRoot { get; private set; }
    /// <summary>
    /// 显示网格的节点
    /// </summary>
    public ColorRect Grid { get; private set; }
    /// <summary>
    /// 当前对象绑定的Ui节点
    /// </summary>
    public IUiNode UiNode { get; private set; }
    
    private ShaderMaterial _gridMaterial;
    private bool _dragMoveFlag = false;
    
    /// <summary>
    /// 初始化节点数据
    /// </summary>
    /// <param name="containerRoot">可拖拽容器根节点</param>
    /// <param name="grid">当前对象绑定的Ui节点</param>
    public void InitNode(Control containerRoot, ColorRect grid = null)
    {
        ContainerRoot = containerRoot;
        if (grid != null)
        {
            Grid = grid;
            grid.MouseFilter = MouseFilterEnum.Ignore;
            _gridMaterial = ResourceManager.Load<ShaderMaterial>(ResourcePath.resource_material_Grid_tres, false);
            grid.Material = _gridMaterial;
        }
    }
    
    public virtual void SetUiNode(IUiNode uiNode)
    {
        UiNode = uiNode;
        this.AddDragListener(DragButtonEnum.Middle, OnDrag);
        Resized += RefreshGridTrans;
        //打开Ui时刷新网格
        UiNode.GetUiPanel().OnShowUiEvent += RefreshGridTrans;
    }

    public virtual void OnDestroy()
    {
        
    }

    public override void _GuiInput(InputEvent @event)
    {
        if (@event is InputEventMouseButton mouseButton)
        {
            AcceptEvent();
            if (mouseButton.ButtonIndex == MouseButton.WheelDown)
            {
                //缩小
                if (Utils.DoShrinkByMousePosition(ContainerRoot, 0.4f))
                {
                    SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X);
                }
            }
            else if (mouseButton.ButtonIndex == MouseButton.WheelUp)
            {
                //放大
                if (Utils.DoMagnifyByMousePosition(ContainerRoot, 20))
                {
                    SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X);
                }
            }
        }
    }
    
    //拖拽回调
    private void OnDrag(DragState state, Vector2 pos)
    {
        if (state == DragState.DragStart)
        {
            if (this.IsMouseInRect())
            {
                _dragMoveFlag = true;
            }
        }
        else if (state == DragState.DragMove)
        {
            if (_dragMoveFlag)
            {
                ContainerRoot.Position += pos;
                RefreshGridTrans();
            }
        }
        else
        {
            _dragMoveFlag = false;
        }
    }
    
    
    /// <summary>
    /// 刷新背景网格位置和缩放
    /// </summary>
    public void RefreshGridTrans()
    {
        if (_gridMaterial != null)
        {
            _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Size, Size);
            SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X);
        }
    }
    
    //设置网格位置和缩放
    private void SetGridTransform(Vector2 pos, float scale)
    {
        if (_gridMaterial != null)
        {
            _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.GridSize, GameConfig.TileCellSize * scale);
            _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Offset, -pos);
        }
    }

    /// <summary>
    /// 设置网格颜色
    /// </summary>
    public void SetLineColor(Color color)
    {
        if (_gridMaterial != null)
        {
            _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Color, color);
        }
    }
    
}