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); } } }