Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorObject / MapEditorObjectPanel.cs
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Config;
  4. using Godot;
  5. using UI.MapEditor;
  6.  
  7. namespace UI.MapEditorObject;
  8.  
  9. public partial class MapEditorObjectPanel : MapEditorObject, IEditorTab
  10. {
  11. /// <summary>
  12. /// 编辑器Tile对象
  13. /// </summary>
  14. public EditorTileMap EditorTileMap { get; private set; }
  15.  
  16. /// <summary>
  17. /// 临时存储普通层自定义物体数据
  18. /// </summary>
  19. public readonly List<RoomObjectInfo> NormalLayerObjects = new List<RoomObjectInfo>();
  20. /// <summary>
  21. /// 临时存储Y排序层自定义物体数据
  22. /// </summary>
  23. public readonly List<RoomObjectInfo> YSortLayerObjects = new List<RoomObjectInfo>();
  24. /// <summary>
  25. /// 当前页签是否选中
  26. /// </summary>
  27. public bool IsActiveTab { get; private set; }
  28.  
  29. /// <summary>
  30. /// 物体网格
  31. /// </summary>
  32. public UiGrid<Item, RoomObjectInfo> ObjectGrid { get; private set; }
  33. public override void OnCreateUi()
  34. {
  35. var editorPanel = (MapEditorPanel)ParentUi;
  36. EditorTileMap = editorPanel.S_TileMap.Instance;
  37. ObjectGrid = CreateUiGrid<Item, RoomObjectInfo, ItemCell>(S_Item);
  38. ObjectGrid.SetHorizontalExpand(true);
  39. ObjectGrid.SelectEvent += OnSelectEvent;
  40. AddEventListener(EventEnum.OnPutObject, OnPutObject);
  41. AddEventListener(EventEnum.OnSelectObject, OnSelectObject);
  42. S_SearchButton.Instance.Pressed += OnSearchClick;
  43. S_LayerOption.Instance.ItemSelected += (index) =>
  44. {
  45. OnChangeObjectLayer(index);
  46. OnSearchClick();
  47. };
  48.  
  49. S_DynamicDeleteButton.Instance.Pressed += OnDelete;
  50. }
  51.  
  52. public override void OnDestroyUi()
  53. {
  54. }
  55.  
  56. /// <summary>
  57. /// 初始化面板数据
  58. /// </summary>
  59. public void InitData()
  60. {
  61. var tileInfo = EditorTileMap.CurrRoomSplit.TileInfo;
  62. if (tileInfo.NormalLayerObjects != null)
  63. {
  64. foreach (var temp in tileInfo.NormalLayerObjects)
  65. {
  66. if (ExcelConfig.EditorObject_Map.ContainsKey(temp.Id))
  67. {
  68. NormalLayerObjects.Add(temp.Clone());
  69. }
  70. }
  71. }
  72.  
  73. if (tileInfo.YSortLayerObjects != null)
  74. {
  75. foreach (var temp in tileInfo.YSortLayerObjects)
  76. {
  77. if (ExcelConfig.EditorObject_Map.ContainsKey(temp.Id))
  78. {
  79. YSortLayerObjects.Add(temp.Clone());
  80. }
  81. }
  82. }
  83. EditorTileMap.MapEditorPanel.S_MapEditorTools.Instance.InitCustomObjectData();
  84. //刷新数据
  85. OnSearchClick();
  86. }
  87. /// <summary>
  88. /// 保存配置数据
  89. /// </summary>
  90. public void OnSaveData(DungeonTileInfo tileInfo)
  91. {
  92. if (tileInfo.NormalLayerObjects == null)
  93. {
  94. tileInfo.NormalLayerObjects = new List<RoomObjectInfo>();
  95. }
  96. else
  97. {
  98. tileInfo.NormalLayerObjects.Clear();
  99. }
  100.  
  101. foreach (var normalLayerObject in NormalLayerObjects)
  102. {
  103. tileInfo.NormalLayerObjects.Add(normalLayerObject.Clone());
  104. }
  105.  
  106. if (tileInfo.YSortLayerObjects == null)
  107. {
  108. tileInfo.YSortLayerObjects = new List<RoomObjectInfo>();
  109. }
  110. else
  111. {
  112. tileInfo.YSortLayerObjects.Clear();
  113. }
  114.  
  115. foreach (var ySortLayerObject in YSortLayerObjects)
  116. {
  117. tileInfo.YSortLayerObjects.Add(ySortLayerObject.Clone());
  118. }
  119. }
  120.  
  121. /// <summary>
  122. /// 聚焦物体
  123. /// </summary>
  124. public void FoceSelectObject(RoomObjectInfo info)
  125. {
  126. EditorTileMap.SetLookPosition(new Vector2(info.X, info.Y));
  127. }
  128.  
  129. /// <summary>
  130. /// 获取当前选中的物体层
  131. /// </summary>
  132. public List<RoomObjectInfo> GetCurrentObjectLayer()
  133. {
  134. return S_LayerOption.Instance.Selected == 0 ? NormalLayerObjects : YSortLayerObjects;
  135. }
  136.  
  137. /// <summary>
  138. /// 获取当前选中的物体层
  139. /// </summary>
  140. public RoomLayerEnum GetCurrentObjectLayerEnum()
  141. {
  142. return S_LayerOption.Instance.Selected == 0 ? RoomLayerEnum.NormalLayer : RoomLayerEnum.YSortLayer;
  143. }
  144.  
  145. private void OnChangeObjectLayer(long index)
  146. {
  147. var editorToolsPanel = EditorTileMap.MapEditorPanel.S_MapEditorTools.Instance;
  148. var toolsPanel = editorToolsPanel;
  149.  
  150. if (index == 0)
  151. {
  152. toolsPanel.CustomNormalRoot.Modulate = Colors.White;
  153. toolsPanel.CustomYSortRoot.Modulate = new Color(1, 1, 1, 0.5f);
  154. }
  155. else
  156. {
  157. toolsPanel.CustomNormalRoot.Modulate = new Color(1, 1, 1, 0.5f);
  158. toolsPanel.CustomYSortRoot.Modulate = Colors.White;
  159. }
  160. //启用当前层的Area2D物体监视
  161. foreach (var custonObjectData in editorToolsPanel.CustomObjecMapping)
  162. {
  163. var objectData = custonObjectData.Value;
  164. objectData.Node.Instance.Monitorable = (long)objectData.Layer == index;
  165. }
  166. }
  167.  
  168. //搜索
  169. public void OnSearchClick()
  170. {
  171. var dataList = GetCurrentObjectLayer();
  172. var text = S_SearchInput.Instance.Text;
  173. if (string.IsNullOrEmpty(text))
  174. {
  175. ObjectGrid.SetDataList(dataList);
  176. }
  177. else
  178. {
  179. var result = dataList.Where(data => ExcelConfig.EditorObject_Map[data.Id].Name.Contains(text)).ToArray();
  180. ObjectGrid.SetDataList(result);
  181. }
  182. }
  183. //创建自定义物体
  184. private void OnPutObject(object obj)
  185. {
  186. var temp = (RoomObjectInfo)obj;
  187. var layer = GetCurrentObjectLayer();
  188. layer.Add(temp);
  189. OnSearchClick();
  190. }
  191. private void OnSelectEvent(int index)
  192. {
  193. if (index < 0)
  194. {
  195. S_DynamicDeleteButton.Instance.Visible = false;
  196. S_DynamicDeleteButton.Reparent(this);
  197. }
  198. else
  199. {
  200. S_DynamicDeleteButton.Instance.Visible = true;
  201. S_DynamicDeleteButton.Reparent(ObjectGrid.GetCell(index).CellNode.Instance);
  202. }
  203. }
  204. //删除
  205. private void OnDelete()
  206. {
  207. if (ObjectGrid.SelectIndex < 0)
  208. {
  209. return;
  210. }
  211.  
  212. EditorWindowManager.ShowConfirm("提示", "确定删除该物体吗?", b =>
  213. {
  214. if (b)
  215. {
  216. var layer = GetCurrentObjectLayer();
  217. var temp = layer[ObjectGrid.SelectIndex];
  218. layer.RemoveAt(ObjectGrid.SelectIndex);
  219. //派发删除事件
  220. EventManager.EmitEvent(EventEnum.OnRemoveObject, temp);
  221. OnSearchClick();
  222.  
  223. //标记数据脏了
  224. EventManager.EmitEvent(EventEnum.OnTileMapDirty);
  225. }
  226. });
  227. }
  228.  
  229. public void OnSelectTab()
  230. {
  231. IsActiveTab = true;
  232. var panel = EditorTileMap.MapEditorPanel;
  233. panel.S_LayerPanel.Instance.Visible = true;
  234. panel.S_LayerPanel.L_MapEditorMapLayer.Instance.HideUi();
  235. panel.S_LayerPanel.L_MapEditorConfigObject.Instance.ShowUi();
  236. panel.S_MapEditorTools.Instance.SetToolButton(EditorToolEnum.Move, EditorToolEnum.ObjectPen, EditorToolEnum.ObjectTool, EditorToolEnum.Focus);
  237. OnChangeObjectLayer(S_LayerOption.Instance.Selected);
  238. }
  239.  
  240. public void OnUnSelectTab()
  241. {
  242. var panel = EditorTileMap.MapEditorPanel;
  243. panel.S_MapEditorTools.Instance.CustomNormalRoot.Modulate = Colors.White;
  244. panel.S_MapEditorTools.Instance.CustomYSortRoot.Modulate = Colors.White;
  245. IsActiveTab = false;
  246. }
  247. private void OnSelectObject(object obj)
  248. {
  249. var data = (RoomObjectInfo)obj;
  250. if (ObjectGrid.SelectData != data)
  251. {
  252. var uiCell = ObjectGrid.Find(item => item.Data == data);
  253. if (uiCell != null)
  254. {
  255. uiCell.Click();
  256. }
  257. }
  258. }
  259. }