Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / tileSetEditorCombination / leftBottom / TileEditArea.cs
@小李xl 小李xl on 24 Jan 2024 4 KB 代码调整
  1. using System.Collections.Generic;
  2. using Godot;
  3.  
  4. namespace UI.TileSetEditorCombination;
  5.  
  6. public partial class TileEditArea : EditorGridBg
  7. {
  8. public new TileSetEditorCombination.LeftBottomBg UiNode => (TileSetEditorCombination.LeftBottomBg)base.UiNode;
  9.  
  10. private UiGrid<TileSetEditorCombination.MaskRect, bool> _maskGrid;
  11. private readonly HashSet<Vector2I> _useMask = new HashSet<Vector2I>();
  12. public override void SetUiNode(IUiNode uiNode)
  13. {
  14. base.SetUiNode(uiNode);
  15. InitNode(UiNode.L_TileTexture.Instance, UiNode.L_Grid.Instance);
  16. UiNode.L_TileTexture.Instance.Texture = UiNode.UiPanel.EditorPanel.Texture;
  17. var maskBrush = UiNode.L_TileTexture.L_MaskBrush.Instance;
  18. maskBrush.Init(UiNode.L_TileTexture.Instance, UiNode.UiPanel.EditorPanel);
  19.  
  20. _maskGrid = new UiGrid<TileSetEditorCombination.MaskRect, bool>(UiNode.L_TileTexture.L_MaskRoot.L_MaskRect, typeof(MaskRectCell));
  21. _maskGrid.SetCellOffset(Vector2I.Zero);
  22. _maskGrid.GridContainer.MouseFilter = MouseFilterEnum.Ignore;
  23.  
  24. //聚焦按钮点击
  25. UiNode.L_FocusBtn.Instance.Pressed += OnFocusClick;
  26. }
  27.  
  28. public override void OnDestroy()
  29. {
  30. base.OnDestroy();
  31. _maskGrid.Destroy();
  32. }
  33.  
  34. public override void _GuiInput(InputEvent @event)
  35. {
  36. base._GuiInput(@event);
  37. if (@event is InputEventMouse)
  38. {
  39. AcceptEvent();
  40. if (Input.IsMouseButtonPressed(MouseButton.Left)) //左键选中
  41. {
  42. var cellPosition = GetMouseCellPosition();
  43. if (UiNode.UiPanel.EditorPanel.IsCellPositionInTexture(cellPosition))
  44. {
  45. if (Input.IsActionJustPressed(InputAction.MouseLeft)) //刚按下, 清除之前的选中
  46. {
  47. ClearSelectCell();
  48. }
  49. OnSelectCell(cellPosition);
  50. }
  51. }
  52. else if (Input.IsMouseButtonPressed(MouseButton.Right)) //右键键擦除
  53. {
  54. var cellPosition = GetMouseCellPosition();
  55. if (UiNode.UiPanel.EditorPanel.IsCellPositionInTexture(cellPosition))
  56. {
  57. OnRemoveCell(cellPosition);
  58. }
  59. }
  60. }
  61. }
  62.  
  63. //聚焦按钮点击
  64. private void OnFocusClick()
  65. {
  66. var texture = UiNode.L_TileTexture.Instance.Texture;
  67. Utils.DoFocusNode(ContainerRoot, Size, texture != null ? texture.GetSize() : Vector2.Zero);
  68. RefreshGridTrans();
  69. }
  70.  
  71. /// <summary>
  72. /// 选中Cell图块
  73. /// </summary>
  74. private void OnSelectCell(Vector2I cell)
  75. {
  76. if (!_useMask.Contains(cell))
  77. {
  78. var cellIndex = UiNode.UiPanel.EditorPanel.CellPositionToIndex(cell);
  79. var uiCell = _maskGrid.GetCell(cellIndex);
  80. if (uiCell != null && !uiCell.Data)
  81. {
  82. _useMask.Add(cell);
  83. uiCell.SetData(true);
  84. EventManager.EmitEvent(EventEnum.OnSelectCombinationCell, cell);
  85. }
  86. }
  87. }
  88.  
  89. /// <summary>
  90. /// 移除指定的Cell图块
  91. /// </summary>
  92. private void OnRemoveCell(Vector2I cell)
  93. {
  94. if (_useMask.Contains(cell))
  95. {
  96. var cellIndex = UiNode.UiPanel.EditorPanel.CellPositionToIndex(cell);
  97. var uiCell = _maskGrid.GetCell(cellIndex);
  98. if (uiCell != null && uiCell.Data)
  99. {
  100. _useMask.Remove(cell);
  101. uiCell.SetData(false);
  102. EventManager.EmitEvent(EventEnum.OnRemoveCombinationCell, cell);
  103. }
  104. }
  105. }
  106. /// <summary>
  107. /// 移除所有选中的Cell图块
  108. /// </summary>
  109. public void ClearSelectCell()
  110. {
  111. _useMask.Clear();
  112. var count = _maskGrid.Count;
  113. for (var i = 0; i < count; i++)
  114. {
  115. var uiCell = _maskGrid.GetCell(i);
  116. if (uiCell.Data)
  117. {
  118. uiCell.SetData(false);
  119. }
  120. }
  121. EventManager.EmitEvent(EventEnum.OnClearCombinationCell);
  122. }
  123.  
  124. /// <summary>
  125. /// 改变TileSet纹理
  126. /// </summary>
  127. public void OnChangeTileSetTexture()
  128. {
  129. var width = UiNode.UiPanel.EditorPanel.CellHorizontal;
  130. var height = UiNode.UiPanel.EditorPanel.CellVertical;
  131. UiNode.L_TileTexture.Instance.Size = UiNode.L_TileTexture.Instance.Texture.GetSize();
  132. _maskGrid.RemoveAll();
  133. _useMask.Clear();
  134. _maskGrid.SetColumns(Mathf.Max(1, width));
  135. for (var i = 0; i < width; i++)
  136. {
  137. for (var j = 0; j < height; j++)
  138. {
  139. _maskGrid.Add(false);
  140. }
  141. }
  142.  
  143. OnFocusClick();
  144. }
  145. /// <summary>
  146. /// 返回鼠标所在的单元格位置, 相对于纹理左上角
  147. /// </summary>
  148. public Vector2I GetMouseCellPosition()
  149. {
  150. return Utils.GetMouseCellPosition(UiNode.L_TileTexture.Instance);
  151. }
  152. }