Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorTools / MapEditorToolsPanel.cs
@lijincheng lijincheng on 30 Jul 2023 6 KB 小修改
  1. using System;
  2. using System.Collections.Generic;
  3. using Godot;
  4.  
  5. namespace UI.MapEditorTools;
  6.  
  7. public partial class MapEditorToolsPanel : MapEditorTools
  8. {
  9. /// <summary>
  10. /// 鼠标悬停区域
  11. /// </summary>
  12. public DoorHoverArea ActiveHoverArea { get; private set; }
  13.  
  14. /// <summary>
  15. /// 所属编辑器Tile对象
  16. /// </summary>
  17. public MapEditor.MapEditor.TileMap EditorMap { get; set; }
  18.  
  19. private List<DoorToolTemplate> _doorTools = new List<DoorToolTemplate>();
  20.  
  21. public override void OnCreateUi()
  22. {
  23. S_N_HoverArea.Instance.Init(this, DoorDirection.N);
  24. S_S_HoverArea.Instance.Init(this, DoorDirection.S);
  25. S_W_HoverArea.Instance.Init(this, DoorDirection.W);
  26. S_E_HoverArea.Instance.Init(this, DoorDirection.E);
  27. S_DoorToolRoot.Instance.RemoveChild(S_DoorToolTemplate.Instance);
  28. }
  29.  
  30. public override void OnShowUi()
  31. {
  32. S_PenTool.Instance.EmitSignal(BaseButton.SignalName.Pressed);
  33. }
  34.  
  35. public override void OnDestroyUi()
  36. {
  37. S_DoorToolTemplate.Instance.QueueFree();
  38. }
  39.  
  40. public override void Process(float delta)
  41. {
  42. S_HoverPreviewRoot.Instance.Visible = ActiveHoverArea != null && !DoorHoverArea.IsDrag;
  43. }
  44.  
  45. public DoorHoverArea GetDoorHoverAreaByDir(DoorDirection direction)
  46. {
  47. switch (direction)
  48. {
  49. case DoorDirection.E: return S_E_HoverArea.Instance;
  50. case DoorDirection.N: return S_N_HoverArea.Instance;
  51. case DoorDirection.W: return S_W_HoverArea.Instance;
  52. case DoorDirection.S: return S_S_HoverArea.Instance;
  53. }
  54. return null;
  55. }
  56.  
  57. /// <summary>
  58. /// 设置活动的鼠标悬停的区域
  59. /// </summary>
  60. public void SetActiveHoverArea(DoorHoverArea hoverArea)
  61. {
  62. ActiveHoverArea = hoverArea;
  63. if (hoverArea != null)
  64. {
  65. S_HoverPreviewRoot.Instance.Reparent(hoverArea.GetParent(), false);
  66. }
  67. else
  68. {
  69. S_HoverPreviewRoot.Instance.Reparent(S_DoorToolRoot.Instance, false);
  70. }
  71. }
  72. /// <summary>
  73. /// 创建门区域设置工具
  74. /// </summary>
  75. /// <param name="position">原点坐标, 单位: 像素</param>
  76. /// <param name="direction">方向</param>
  77. /// <param name="start">起始位置, 单位: 像素</param>
  78. /// <param name="size">区域大小, 单位: 像素</param>
  79. public DoorToolTemplate CreateDoorTool(Vector2 position, DoorDirection direction, int start, int size)
  80. {
  81. var inst = CreateDoorToolInstance(GetDoorHoverAreaByDir(direction));
  82. inst.Instance.SetDoorAreaPosition(position);
  83. inst.Instance.SetDoorAreaDirection(direction);
  84. inst.Instance.SetDoorAreaRange(start, size);
  85. return inst;
  86. }
  87.  
  88. /// <summary>
  89. /// 创建拖拽状态下的门区域工具, 用于创建门区域
  90. /// </summary>
  91. /// <param name="position">原点坐标, 单位: 像素</param>
  92. /// <param name="direction">方向</param>
  93. /// <param name="start">起始位置, 单位: 像素</param>
  94. /// <param name="onSubmit">成功提交时回调, 参数1为方向, 参数2为起始点, 参数3为大小</param>
  95. /// <param name="onCancel">取消提交时调用</param>
  96. public DoorToolTemplate CreateDragDoorTool(Vector2 position, DoorDirection direction, int start,
  97. Action<DoorDirection, int, int> onSubmit, Action onCancel)
  98. {
  99. var inst = CreateDoorToolInstance(GetDoorHoverAreaByDir(direction));
  100. inst.Instance.SetDoorAreaPosition(position);
  101. inst.Instance.SetDoorAreaDirection(direction);
  102. inst.Instance.SetDoorAreaRange(start, 0);
  103. inst.Instance.MakeDragMode(onSubmit, () =>
  104. {
  105. RemoveDoorTool(inst);
  106. onCancel();
  107. });
  108. return inst;
  109. }
  110.  
  111. /// <summary>
  112. /// 移除门区域设置工具
  113. /// </summary>
  114. public void RemoveDoorTool(DoorToolTemplate toolInstance)
  115. {
  116. _doorTools.Remove(toolInstance);
  117. toolInstance.Instance.QueueFree();
  118. }
  119.  
  120. /// <summary>
  121. /// 设置门区域工具的大小和缩放
  122. /// </summary>
  123. /// <param name="pos">坐标</param>
  124. /// <param name="scale">缩放</param>
  125. public void SetDoorToolTransform(Vector2 pos, Vector2 scale)
  126. {
  127. S_DoorToolRoot.Instance.Position = pos;
  128. S_DoorToolRoot.Instance.Scale = scale;
  129. }
  130.  
  131. /// <summary>
  132. /// 设置鼠标悬停区域位置和大小
  133. /// </summary>
  134. /// <param name="position">房间起始点, 单位: 格</param>
  135. /// <param name="size">房间大小, 单位: 格</param>
  136. public void SetDoorHoverToolTransform(Vector2I position, Vector2I size)
  137. {
  138. position *= GameConfig.TileCellSize;
  139. size *= GameConfig.TileCellSize;
  140. S_N_HoverRoot.Instance.Position = position + GameConfig.TileCellSizeVector2I;
  141. S_E_HoverRoot.Instance.Position = new Vector2(position.X + size.X - GameConfig.TileCellSize, position.Y + GameConfig.TileCellSize);
  142. S_S_HoverRoot.Instance.Position = new Vector2(position.X + GameConfig.TileCellSize, position.Y + size.Y - GameConfig.TileCellSize);
  143. S_W_HoverRoot.Instance.Position = position + GameConfig.TileCellSizeVector2I;
  144. S_N_HoverArea.Instance.Size = new Vector2(size.X - GameConfig.TileCellSize * 2, S_N_HoverArea.Instance.Size.Y);
  145. S_E_HoverArea.Instance.Size = new Vector2(size.Y - GameConfig.TileCellSize * 2, S_E_HoverArea.Instance.Size.Y);
  146. S_S_HoverArea.Instance.Size = new Vector2(size.X - GameConfig.TileCellSize * 2, S_S_HoverArea.Instance.Size.Y);
  147. S_W_HoverArea.Instance.Size = new Vector2(size.Y - GameConfig.TileCellSize * 2, S_W_HoverArea.Instance.Size.Y);
  148. }
  149. private DoorToolTemplate CreateDoorToolInstance(DoorHoverArea doorHoverArea)
  150. {
  151. var doorTool = S_DoorToolTemplate.Clone();
  152. S_DoorToolRoot.Instance.AddChild(doorTool.Instance);
  153. doorTool.Instance.SetDoorDragAreaNode(doorTool);
  154. doorTool.L_StartBtn.Instance.SetMapEditorToolsPanel(this);
  155. doorTool.L_EndBtn.Instance.SetMapEditorToolsPanel(this);
  156. _doorTools.Add(doorTool);
  157. return doorTool;
  158. }
  159. }