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 : GridBg<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. Grid = UiNode.L_Grid.Instance;
  14. ContainerRoot = UiNode.L_TileTexture.Instance;
  15. UiNode.L_TileTexture.Instance.Texture = UiNode.UiPanel.EditorPanel.Texture;
  16. var maskBrush = UiNode.L_TileTexture.L_MaskBrush.Instance;
  17. maskBrush.TileTexture = UiNode.L_TileTexture.Instance;
  18. maskBrush.TileEditArea = this;
  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. OnClearCell();
  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. if (texture != null)
  68. {
  69. Utils.DoFocusNode(ContainerRoot, Size, texture.GetSize());
  70. }
  71. else
  72. {
  73. Utils.DoFocusNode(ContainerRoot, Size, Vector2.Zero);
  74. }
  75.  
  76. RefreshGridTrans();
  77. }
  78.  
  79. /// <summary>
  80. /// 选中Cell图块
  81. /// </summary>
  82. private void OnSelectCell(Vector2I cell)
  83. {
  84. if (!_useMask.Contains(cell))
  85. {
  86. var cellIndex = UiNode.UiPanel.EditorPanel.CellPositionToIndex(cell);
  87. var uiCell = _maskGrid.GetCell(cellIndex);
  88. if (uiCell != null && !uiCell.Data)
  89. {
  90. _useMask.Add(cell);
  91. uiCell.SetData(true);
  92. EventManager.EmitEvent(EventEnum.OnSelectCombinationCell, cell);
  93. }
  94. }
  95. }
  96.  
  97. /// <summary>
  98. /// 移除指定的Cell图块
  99. /// </summary>
  100. private void OnRemoveCell(Vector2I cell)
  101. {
  102. if (_useMask.Contains(cell))
  103. {
  104. var cellIndex = UiNode.UiPanel.EditorPanel.CellPositionToIndex(cell);
  105. var uiCell = _maskGrid.GetCell(cellIndex);
  106. if (uiCell != null && uiCell.Data)
  107. {
  108. _useMask.Remove(cell);
  109. uiCell.SetData(false);
  110. EventManager.EmitEvent(EventEnum.OnRemoveCombinationCell, cell);
  111. }
  112. }
  113. }
  114. /// <summary>
  115. /// 移除所有选中的Cell图块
  116. /// </summary>
  117. private void OnClearCell()
  118. {
  119. _useMask.Clear();
  120. var count = _maskGrid.Count;
  121. for (var i = 0; i < count; i++)
  122. {
  123. var uiCell = _maskGrid.GetCell(i);
  124. if (uiCell.Data)
  125. {
  126. uiCell.SetData(false);
  127. }
  128. }
  129. EventManager.EmitEvent(EventEnum.OnClearCombinationCell);
  130. }
  131.  
  132. /// <summary>
  133. /// 改变TileSet纹理
  134. /// </summary>
  135. public void OnChangeTileSetTexture()
  136. {
  137. var width = UiNode.UiPanel.EditorPanel.CellHorizontal;
  138. var height = UiNode.UiPanel.EditorPanel.CellVertical;
  139. UiNode.L_TileTexture.Instance.Size = UiNode.L_TileTexture.Instance.Texture.GetSize();
  140. _maskGrid.RemoveAll();
  141. _useMask.Clear();
  142. _maskGrid.SetColumns(width);
  143. for (var i = 0; i < width; i++)
  144. {
  145. for (var j = 0; j < height; j++)
  146. {
  147. _maskGrid.Add(false);
  148. }
  149. }
  150.  
  151. OnFocusClick();
  152. }
  153. /// <summary>
  154. /// 返回鼠标所在的单元格位置, 相对于纹理左上角
  155. /// </summary>
  156. public Vector2I GetMouseCellPosition()
  157. {
  158. var textureRect = UiNode.L_TileTexture.Instance;
  159. var pos = textureRect.GetLocalMousePosition() / GameConfig.TileCellSize;
  160. return pos.AsVector2I();
  161. }
  162. }