Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / common / ui / EditorGridBg.cs
  1. using Godot;
  2.  
  3. /// <summary>
  4. /// 通用Ui网格背景组件, 包含可拖拽的容器根节点
  5. /// </summary>
  6. public abstract partial class EditorGridBg<T> : ColorRect, IUiNodeScript where T : IUiNode
  7. {
  8. /// <summary>
  9. /// 可拖拽容器根节点
  10. /// </summary>
  11. public Control ContainerRoot { get; private set; }
  12. /// <summary>
  13. /// 显示网格的节点
  14. /// </summary>
  15. public ColorRect Grid { get; private set; }
  16. /// <summary>
  17. /// 当前对象绑定的Ui节点
  18. /// </summary>
  19. public T UiNode { get; private set; }
  20. private ShaderMaterial _gridMaterial;
  21. /// <summary>
  22. /// 初始化节点数据
  23. /// </summary>
  24. /// <param name="containerRoot">可拖拽容器根节点</param>
  25. /// <param name="grid">当前对象绑定的Ui节点</param>
  26. public void InitNode(Control containerRoot, ColorRect grid)
  27. {
  28. ContainerRoot = containerRoot;
  29. Grid = grid;
  30. grid.MouseFilter = MouseFilterEnum.Ignore;
  31. _gridMaterial = ResourceManager.Load<ShaderMaterial>(ResourcePath.resource_material_Grid_tres, false);
  32. grid.Material = _gridMaterial;
  33. }
  34. public virtual void SetUiNode(IUiNode uiNode)
  35. {
  36. UiNode = (T)uiNode;
  37. this.AddDragListener(DragButtonEnum.Middle, OnDrag);
  38. Resized += RefreshGridTrans;
  39. //打开Ui时刷新网格
  40. UiNode.GetUiPanel().OnShowUiEvent += RefreshGridTrans;
  41. }
  42.  
  43. public virtual void OnDestroy()
  44. {
  45. }
  46.  
  47. public override void _GuiInput(InputEvent @event)
  48. {
  49. if (@event is InputEventMouseButton mouseButton)
  50. {
  51. AcceptEvent();
  52. if (mouseButton.ButtonIndex == MouseButton.WheelDown)
  53. {
  54. //缩小
  55. if (Utils.DoShrinkByMousePosition(ContainerRoot, 0.4f))
  56. {
  57. SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X);
  58. }
  59. }
  60. else if (mouseButton.ButtonIndex == MouseButton.WheelUp)
  61. {
  62. //放大
  63. if (Utils.DoMagnifyByMousePosition(ContainerRoot, 20))
  64. {
  65. SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X);
  66. }
  67. }
  68. }
  69. }
  70. //拖拽回调
  71. private void OnDrag(DragState state, Vector2 pos)
  72. {
  73. if (state == DragState.DragMove)
  74. {
  75. ContainerRoot.Position += pos;
  76. RefreshGridTrans();
  77. }
  78. }
  79. /// <summary>
  80. /// 刷新背景网格位置和缩放
  81. /// </summary>
  82. public void RefreshGridTrans()
  83. {
  84. _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Size, Size);
  85. SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X);
  86. }
  87. //设置网格位置和缩放
  88. private void SetGridTransform(Vector2 pos, float scale)
  89. {
  90. _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.GridSize, GameConfig.TileCellSize * scale);
  91. _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Offset, -pos);
  92. }
  93. }