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