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