Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorTools / MapEditorToolsPanel.cs
@小李xl 小李xl on 6 Aug 2023 12 KB 更新Ui生成器
  1. using System;
  2. using System.Collections.Generic;
  3. using Godot;
  4. using UI.MapEditor;
  5.  
  6. namespace UI.MapEditorTools;
  7.  
  8. public partial class MapEditorToolsPanel : MapEditorTools
  9. {
  10. public class ToolBtnData
  11. {
  12. public bool CanSelect = false;
  13. public string Icon;
  14. public Action OnClick;
  15.  
  16. public ToolBtnData(bool canSelect, string icon, Action onClick)
  17. {
  18. CanSelect = canSelect;
  19. Icon = icon;
  20. OnClick = onClick;
  21. }
  22. }
  23. /// <summary>
  24. /// 鼠标悬停区域
  25. /// </summary>
  26. public DoorHoverArea ActiveHoverArea { get; private set; }
  27.  
  28. /// <summary>
  29. /// 所属编辑器Tile对象
  30. /// </summary>
  31. public MapEditor.MapEditor.TileMap EditorMap { get; set; }
  32.  
  33. private List<DoorToolTemplate> _doorTools = new List<DoorToolTemplate>();
  34. private UiGrid<ToolButton, ToolBtnData> _toolGrid;
  35.  
  36. public override void OnCreateUi()
  37. {
  38. S_N_HoverArea.Instance.Init(this, DoorDirection.N);
  39. S_S_HoverArea.Instance.Init(this, DoorDirection.S);
  40. S_W_HoverArea.Instance.Init(this, DoorDirection.W);
  41. S_E_HoverArea.Instance.Init(this, DoorDirection.E);
  42. S_DoorToolRoot.Instance.RemoveChild(S_DoorToolTemplate.Instance);
  43.  
  44. _toolGrid = new UiGrid<ToolButton, ToolBtnData>(S_ToolButton, typeof(ToolButtonCell));
  45. _toolGrid.SetColumns(10);
  46. //拖拽按钮
  47. _toolGrid.Add(new ToolBtnData(true, ResourcePath.resource_sprite_ui_commonIcon_DragTool_png, () =>
  48. {
  49. EventManager.EmitEvent(EventEnum.OnSelectDragTool);
  50. }));
  51. //画笔按钮
  52. _toolGrid.Add(new ToolBtnData(true, ResourcePath.resource_sprite_ui_commonIcon_PenTool_png, () =>
  53. {
  54. EventManager.EmitEvent(EventEnum.OnSelectPenTool);
  55. }));
  56. //绘制区域按钮
  57. _toolGrid.Add(new ToolBtnData(true, ResourcePath.resource_sprite_ui_commonIcon_AreaTool_png, () =>
  58. {
  59. EventManager.EmitEvent(EventEnum.OnSelectRectTool);
  60. }));
  61. //编辑门区域按钮
  62. _toolGrid.Add(new ToolBtnData(true, ResourcePath.resource_sprite_ui_commonIcon_DoorTool_png, () =>
  63. {
  64. EventManager.EmitEvent(EventEnum.OnSelectDoorTool);
  65. }));
  66. //聚焦按钮
  67. _toolGrid.Add(new ToolBtnData(false, ResourcePath.resource_sprite_ui_commonIcon_CenterTool_png, () =>
  68. {
  69. EventManager.EmitEvent(EventEnum.OnClickCenterTool);
  70. }));
  71. _toolGrid.SelectIndex = 1;
  72. }
  73.  
  74. public override void OnDestroyUi()
  75. {
  76. S_DoorToolTemplate.Instance.QueueFree();
  77. _toolGrid.Destroy();
  78. }
  79.  
  80. public override void Process(float delta)
  81. {
  82. S_HoverPreviewRoot.Instance.Visible = ActiveHoverArea != null && !DoorHoverArea.IsDrag;
  83. if (EditorMap.Instance.MouseType == EditorTileMap.MouseButtonType.Door)
  84. {
  85. S_DoorToolRoot.Instance.Modulate = new Color(1, 1, 1, 1);
  86. }
  87. else
  88. {
  89. S_DoorToolRoot.Instance.Modulate = new Color(1, 1, 1, 0.4f);
  90. }
  91. }
  92.  
  93. public DoorHoverArea GetDoorHoverArea(DoorDirection direction)
  94. {
  95. switch (direction)
  96. {
  97. case DoorDirection.E: return S_E_HoverArea.Instance;
  98. case DoorDirection.N: return S_N_HoverArea.Instance;
  99. case DoorDirection.W: return S_W_HoverArea.Instance;
  100. case DoorDirection.S: return S_S_HoverArea.Instance;
  101. }
  102. return null;
  103. }
  104. public Control GetDoorHoverAreaRoot(DoorDirection direction)
  105. {
  106. switch (direction)
  107. {
  108. case DoorDirection.E: return S_E_HoverRoot.Instance;
  109. case DoorDirection.N: return S_N_HoverRoot.Instance;
  110. case DoorDirection.W: return S_W_HoverRoot.Instance;
  111. case DoorDirection.S: return S_S_HoverRoot.Instance;
  112. }
  113. return null;
  114. }
  115.  
  116. /// <summary>
  117. /// 设置活动的鼠标悬停的区域
  118. /// </summary>
  119. public void SetActiveHoverArea(DoorHoverArea hoverArea)
  120. {
  121. ActiveHoverArea = hoverArea;
  122. if (hoverArea != null)
  123. {
  124. S_HoverPreviewRoot.Instance.Reparent(hoverArea.GetParent(), false);
  125. }
  126. else
  127. {
  128. S_HoverPreviewRoot.Instance.Reparent(S_DoorToolRoot.Instance, false);
  129. }
  130. }
  131.  
  132. /// <summary>
  133. /// 创建门区域设置工具
  134. /// </summary>
  135. /// <param name="doorAreaInfo">门区域数据</param>
  136. public DoorToolTemplate CreateDoorTool(DoorAreaInfo doorAreaInfo)
  137. {
  138. var doorHoverArea = GetDoorHoverArea(doorAreaInfo.Direction);
  139. var inst = CreateDoorToolInstance(doorHoverArea);
  140. inst.Instance.DoorAreaInfo = doorAreaInfo;
  141. inst.Instance.SetDoorAreaPosition(GetDoorHoverAreaRoot(doorAreaInfo.Direction).Position);
  142. inst.Instance.SetDoorAreaRange(doorAreaInfo.Start, doorAreaInfo.End);
  143. return inst;
  144. }
  145.  
  146. /// <summary>
  147. /// 创建拖拽状态下的门区域工具, 用于创建门区域
  148. /// </summary>
  149. /// <param name="doorHoverArea">悬停区域</param>
  150. /// <param name="start">起始位置, 单位: 像素</param>
  151. /// <param name="onSubmit">成功提交时回调, 参数1为方向, 参数2为起始点, 参数3为大小</param>
  152. /// <param name="onCancel">取消提交时调用</param>
  153. public DoorToolTemplate CreateDragDoorTool(DoorHoverArea doorHoverArea, int start,
  154. Action<DoorDirection, int, int> onSubmit, Action onCancel)
  155. {
  156. var inst = CreateDoorToolInstance(doorHoverArea);
  157. inst.Instance.SetDoorAreaPosition(GetDoorHoverAreaRoot(doorHoverArea.Direction).Position);
  158. inst.Instance.SetDoorAreaRange(start, start);
  159. inst.Instance.MakeDragMode(onSubmit, () =>
  160. {
  161. RemoveDoorTool(inst);
  162. onCancel();
  163. });
  164. return inst;
  165. }
  166.  
  167. /// <summary>
  168. /// 移除门区域设置工具
  169. /// </summary>
  170. public void RemoveDoorTool(DoorToolTemplate toolInstance)
  171. {
  172. _doorTools.Remove(toolInstance);
  173. if (toolInstance.Instance.DoorAreaInfo != null)
  174. {
  175. EditorMap.Instance.RemoveDoorArea(toolInstance.Instance.DoorAreaInfo);
  176. }
  177. toolInstance.Instance.QueueFree();
  178. }
  179.  
  180. /// <summary>
  181. /// 设置门区域工具的大小和缩放
  182. /// </summary>
  183. /// <param name="pos">坐标</param>
  184. /// <param name="scale">缩放</param>
  185. public void SetDoorToolTransform(Vector2 pos, Vector2 scale)
  186. {
  187. S_DoorToolRoot.Instance.Position = pos;
  188. S_DoorToolRoot.Instance.Scale = scale;
  189. }
  190.  
  191. /// <summary>
  192. /// 设置鼠标悬停区域位置和大小
  193. /// </summary>
  194. /// <param name="position">房间起始点, 单位: 格</param>
  195. /// <param name="size">房间大小, 单位: 格</param>
  196. public void SetDoorHoverToolTransform(Vector2I position, Vector2I size)
  197. {
  198. position *= GameConfig.TileCellSize;
  199. size *= GameConfig.TileCellSize;
  200.  
  201. var nPos1 = S_N_HoverRoot.Instance.Position;
  202. var ePos1 = S_E_HoverRoot.Instance.Position;
  203. var sPos1 = S_S_HoverRoot.Instance.Position;
  204. var wPos1 = S_W_HoverRoot.Instance.Position;
  205. var nPos2 = position + GameConfig.TileCellSizeVector2I;
  206. var ePos2 = new Vector2(position.X + size.X - GameConfig.TileCellSize, position.Y + GameConfig.TileCellSize);
  207. var sPos2 = new Vector2(position.X + GameConfig.TileCellSize, position.Y + size.Y - GameConfig.TileCellSize);
  208. var wPos2 = position + GameConfig.TileCellSizeVector2I;
  209.  
  210. var nSize2 = new Vector2(size.X - GameConfig.TileCellSize * 2, S_N_HoverArea.Instance.Size.Y);
  211. var eSize2 = new Vector2(size.Y - GameConfig.TileCellSize * 2, S_E_HoverArea.Instance.Size.Y);
  212. var sSize2 = new Vector2(size.X - GameConfig.TileCellSize * 2, S_S_HoverArea.Instance.Size.Y);
  213. var wSize2 = new Vector2(size.Y - GameConfig.TileCellSize * 2, S_W_HoverArea.Instance.Size.Y);
  214. S_N_HoverRoot.Instance.Position = nPos2;
  215. S_E_HoverRoot.Instance.Position = ePos2;
  216. S_S_HoverRoot.Instance.Position = sPos2;
  217. S_W_HoverRoot.Instance.Position = wPos2;
  218. S_N_HoverArea.Instance.Size = nSize2;
  219. S_E_HoverArea.Instance.Size = eSize2;
  220. S_S_HoverArea.Instance.Size = sSize2;
  221. S_W_HoverArea.Instance.Size = wSize2;
  222. //调整门区域
  223. for (var i = 0; i < _doorTools.Count; i++)
  224. {
  225. var doorTool = _doorTools[i];
  226. var direction = doorTool.Instance.Direction;
  227. var areaRoot = GetDoorHoverAreaRoot(direction);
  228. var doorAreaRange = doorTool.Instance.GetDoorAreaRange();
  229. doorTool.Instance.SetDoorAreaPosition(areaRoot.Position);
  230.  
  231. if (direction == DoorDirection.N)
  232. {
  233. var hOffset = (int)(nPos2.X - nPos1.X);
  234. doorAreaRange.X -= hOffset;
  235. doorAreaRange.Y -= hOffset;
  236.  
  237. if (doorAreaRange.X >= 0 && doorAreaRange.Y <= nSize2.X) //允许提交
  238. {
  239. doorTool.Instance.SetDoorAreaRange(doorAreaRange.X, doorAreaRange.Y);
  240. if (doorTool.Instance.DoorAreaInfo != null)
  241. {
  242. doorTool.Instance.DoorAreaInfo.Start = doorAreaRange.X;
  243. doorTool.Instance.DoorAreaInfo.End = doorAreaRange.Y;
  244. }
  245. }
  246. else //如果超出区域, 则删除
  247. {
  248. RemoveDoorTool(doorTool);
  249. i--;
  250. }
  251. }
  252. else if (direction == DoorDirection.S)
  253. {
  254. var hOffset = (int)(sPos2.X - sPos1.X);
  255. doorAreaRange.X -= hOffset;
  256. doorAreaRange.Y -= hOffset;
  257.  
  258. if (doorAreaRange.X >= 0 && doorAreaRange.Y <= sSize2.X) //允许提交
  259. {
  260. doorTool.Instance.SetDoorAreaRange(doorAreaRange.X, doorAreaRange.Y);
  261. if (doorTool.Instance.DoorAreaInfo != null)
  262. {
  263. doorTool.Instance.DoorAreaInfo.Start = doorAreaRange.X;
  264. doorTool.Instance.DoorAreaInfo.End = doorAreaRange.Y;
  265. }
  266. }
  267. else //如果超出区域, 则删除
  268. {
  269. RemoveDoorTool(doorTool);
  270. i--;
  271. }
  272. }
  273. else if (direction == DoorDirection.E)
  274. {
  275. var vOffset = (int)(ePos2.Y - ePos1.Y);
  276. doorAreaRange.X -= vOffset;
  277. doorAreaRange.Y -= vOffset;
  278.  
  279. if (doorAreaRange.X >= 0 && doorAreaRange.Y <= eSize2.X) //允许提交
  280. {
  281. doorTool.Instance.SetDoorAreaRange(doorAreaRange.X, doorAreaRange.Y);
  282. if (doorTool.Instance.DoorAreaInfo != null)
  283. {
  284. doorTool.Instance.DoorAreaInfo.Start = doorAreaRange.X;
  285. doorTool.Instance.DoorAreaInfo.End = doorAreaRange.Y;
  286. }
  287. }
  288. else //如果超出区域, 则删除
  289. {
  290. RemoveDoorTool(doorTool);
  291. i--;
  292. }
  293. }
  294. else if (direction == DoorDirection.W)
  295. {
  296. var vOffset = (int)(wPos2.Y - wPos1.Y);
  297. doorAreaRange.X -= vOffset;
  298. doorAreaRange.Y -= vOffset;
  299.  
  300. if (doorAreaRange.X >= 0 && doorAreaRange.Y <= wSize2.X) //允许提交
  301. {
  302. doorTool.Instance.SetDoorAreaRange(doorAreaRange.X, doorAreaRange.Y);
  303. if (doorTool.Instance.DoorAreaInfo != null)
  304. {
  305. doorTool.Instance.DoorAreaInfo.Start = doorAreaRange.X;
  306. doorTool.Instance.DoorAreaInfo.End = doorAreaRange.Y;
  307. }
  308. }
  309. else //如果超出区域, 则删除
  310. {
  311. RemoveDoorTool(doorTool);
  312. i--;
  313. }
  314. }
  315. }
  316. }
  317. private DoorToolTemplate CreateDoorToolInstance(DoorHoverArea doorHoverArea)
  318. {
  319. var doorTool = S_DoorToolTemplate.Clone();
  320. S_DoorToolRoot.Instance.AddChild(doorTool.Instance);
  321. doorTool.Instance.SetDoorDragAreaNode(doorTool);
  322. doorTool.L_StartBtn.Instance.SetMapEditorToolsPanel(this);
  323. doorTool.L_EndBtn.Instance.SetMapEditorToolsPanel(this);
  324. doorTool.Instance.SetDoorHoverArea(doorHoverArea);
  325. _doorTools.Add(doorTool);
  326. return doorTool;
  327. }
  328. }