Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / common / ui / EditorGridBg.cs
@小李xl 小李xl on 24 Jan 2024 3 KB 代码调整
  1. using Godot;
  2.  
  3. /// <summary>
  4. /// 通用Ui网格背景组件, 包含可拖拽的容器根节点
  5. /// </summary>
  6. public abstract partial class EditorGridBg : ColorRect, IUiNodeScript
  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 IUiNode UiNode { get; private set; }
  20. private ShaderMaterial _gridMaterial;
  21. private bool _dragMoveFlag = false;
  22. /// <summary>
  23. /// 初始化节点数据
  24. /// </summary>
  25. /// <param name="containerRoot">可拖拽容器根节点</param>
  26. /// <param name="grid">当前对象绑定的Ui节点</param>
  27. public void InitNode(Control containerRoot, ColorRect grid = null)
  28. {
  29. ContainerRoot = containerRoot;
  30. if (grid != null)
  31. {
  32. Grid = grid;
  33. grid.MouseFilter = MouseFilterEnum.Ignore;
  34. _gridMaterial = ResourceManager.Load<ShaderMaterial>(ResourcePath.resource_material_Grid_tres, false);
  35. grid.Material = _gridMaterial;
  36. }
  37. }
  38. public virtual void SetUiNode(IUiNode uiNode)
  39. {
  40. UiNode = uiNode;
  41. this.AddDragListener(DragButtonEnum.Middle, OnDrag);
  42. Resized += RefreshGridTrans;
  43. //打开Ui时刷新网格
  44. UiNode.GetUiPanel().OnShowUiEvent += RefreshGridTrans;
  45. }
  46.  
  47. public virtual void OnDestroy()
  48. {
  49. }
  50.  
  51. public override void _GuiInput(InputEvent @event)
  52. {
  53. if (@event is InputEventMouseButton mouseButton)
  54. {
  55. AcceptEvent();
  56. if (mouseButton.ButtonIndex == MouseButton.WheelDown)
  57. {
  58. //缩小
  59. if (Utils.DoShrinkByMousePosition(ContainerRoot, 0.4f))
  60. {
  61. SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X);
  62. }
  63. }
  64. else if (mouseButton.ButtonIndex == MouseButton.WheelUp)
  65. {
  66. //放大
  67. if (Utils.DoMagnifyByMousePosition(ContainerRoot, 20))
  68. {
  69. SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X);
  70. }
  71. }
  72. }
  73. }
  74. //拖拽回调
  75. private void OnDrag(DragState state, Vector2 pos)
  76. {
  77. if (state == DragState.DragStart)
  78. {
  79. if (this.IsMouseInRect())
  80. {
  81. _dragMoveFlag = true;
  82. }
  83. }
  84. else if (state == DragState.DragMove)
  85. {
  86. if (_dragMoveFlag)
  87. {
  88. ContainerRoot.Position += pos;
  89. RefreshGridTrans();
  90. }
  91. }
  92. else
  93. {
  94. _dragMoveFlag = false;
  95. }
  96. }
  97. /// <summary>
  98. /// 刷新背景网格位置和缩放
  99. /// </summary>
  100. public void RefreshGridTrans()
  101. {
  102. if (_gridMaterial != null)
  103. {
  104. _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Size, Size);
  105. SetGridTransform(ContainerRoot.Position, ContainerRoot.Scale.X);
  106. }
  107. }
  108. //设置网格位置和缩放
  109. private void SetGridTransform(Vector2 pos, float scale)
  110. {
  111. if (_gridMaterial != null)
  112. {
  113. _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.GridSize, GameConfig.TileCellSize * scale);
  114. _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Offset, -pos);
  115. }
  116. }
  117.  
  118. /// <summary>
  119. /// 设置网格颜色
  120. /// </summary>
  121. public void SetLineColor(Color color)
  122. {
  123. if (_gridMaterial != null)
  124. {
  125. _gridMaterial.SetShaderMaterialParameter(ShaderParamNames.Color, color);
  126. }
  127. }
  128. }