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