Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditor / MapEditorPanel.cs
@小李xl 小李xl on 20 Jan 2024 8 KB 调整TileMap编辑器布局
  1. using System.Linq;
  2. using Godot;
  3.  
  4. namespace UI.MapEditor;
  5.  
  6. public partial class MapEditorPanel : MapEditor
  7. {
  8. private class CheckResult
  9. {
  10. /// <summary>
  11. /// 是否存在错误
  12. /// </summary>
  13. public bool HasError;
  14. /// <summary>
  15. /// 房间异常类型
  16. /// </summary>
  17. public RoomErrorType ErrorType;
  18.  
  19. public CheckResult(bool hasError, RoomErrorType errorType)
  20. {
  21. HasError = hasError;
  22. ErrorType = errorType;
  23. }
  24. }
  25. private string _title;
  26. public override void OnCreateUi()
  27. {
  28. S_TabContainer.Instance.SetTabTitle(0, "图块");
  29. S_TabContainer.Instance.SetTabTitle(1, "对象");
  30. S_TabContainer.Instance.TabChanged += OnTabChanged;
  31. //S_MapLayer.Instance.Init(S_MapLayer);
  32. S_Left.Instance.Resized += OnMapViewResized;
  33. S_Back.Instance.Pressed += OnBackClick;
  34. S_Save.Instance.Pressed += OnSave;
  35. S_Play.Instance.Pressed += OnPlay;
  36.  
  37. OnTabChanged(0);
  38. }
  39.  
  40. //切换页签
  41. private void OnTabChanged(long tab)
  42. {
  43. S_LayerPanel.Instance.Visible = tab == 0;
  44. }
  45.  
  46. public override void OnShowUi()
  47. {
  48. OnMapViewResized();
  49. }
  50.  
  51. public override void OnDestroyUi()
  52. {
  53. //清除选中的标记
  54. EditorTileMapManager.SetSelectMark(null);
  55. //清除选中的波
  56. EditorTileMapManager.SetSelectWaveIndex(-1);
  57. //清除选中的预设
  58. EditorTileMapManager.SetSelectPreinstallIndex(-1);
  59. }
  60.  
  61. //点击播放按钮
  62. private void OnPlay()
  63. {
  64. S_TileMap.Instance.TryRunCheckHandler();
  65. var check = CheckError();
  66. //有错误数据
  67. if (check.HasError)
  68. {
  69. EditorWindowManager.ShowTips("提示", EditorTileMapManager.GetRoomErrorTypeMessage(check.ErrorType) + ",不能运行房间!");
  70. return;
  71. }
  72. //保存数据
  73. S_TileMap.Instance.TriggerSave(RoomErrorType.None, () =>
  74. {
  75. var groupName = EditorTileMapManager.SelectDungeonGroup.GroupName;
  76. var result = DungeonManager.CheckDungeon(groupName);
  77. if (result.HasError)
  78. {
  79. EditorWindowManager.ShowTips("警告", "当前组'" + groupName + "'" + result.ErrorMessage + ", 不能生成地牢!");
  80. }
  81. else
  82. {
  83. //执行运行
  84. EditorPlayManager.Play(this);
  85. }
  86. });
  87. }
  88.  
  89. /// <summary>
  90. /// 加载地牢, 返回是否加载成功
  91. /// </summary>
  92. public bool LoadMap(DungeonRoomSplit roomSplit, TileSetSplit tileSetSplit)
  93. {
  94. _title = "正在编辑:" + roomSplit.RoomInfo.RoomName;
  95. S_Title.Instance.Text = _title;
  96. //初始化 TileMap 层
  97. S_TileMap.Instance.InitLayer();
  98. //加载层级
  99. S_MapEditorMapLayer.Instance.InitData();
  100. //加载MapTile面板
  101. S_MapEditorMapTile.Instance.InitData(tileSetSplit);
  102. //加载Tile
  103. var loadMap = S_TileMap.Instance.Load(roomSplit, tileSetSplit);
  104. S_MapEditorMapMark.Instance.RefreshPreinstallSelect();
  105. return loadMap;
  106. }
  107.  
  108. /// <summary>
  109. /// 设置标题是否带 *
  110. /// </summary>
  111. public void SetTitleDirty(bool value)
  112. {
  113. if (value)
  114. {
  115. S_Title.Instance.Text = _title + "*";
  116. }
  117. else
  118. {
  119. S_Title.Instance.Text = _title;
  120. }
  121. }
  122. //调整地图显示区域大小
  123. private void OnMapViewResized()
  124. {
  125. S_SubViewport.Instance.Size = S_Left.Instance.Size.AsVector2I() - new Vector2I(4, 4);
  126. }
  127. //保存地图数据
  128. private void OnSave()
  129. {
  130. S_TileMap.Instance.TryRunCheckHandler();
  131. var check = CheckError();
  132. //有错误的数据
  133. if (check.HasError)
  134. {
  135. EditorWindowManager.ShowConfirm("提示", EditorTileMapManager.GetRoomErrorTypeMessage(check.ErrorType) + ",如果现在保存并退出,运行游戏将不会刷出该房间!\n是否仍要保存?", (v) =>
  136. {
  137. if (v)
  138. {
  139. S_TileMap.Instance.TriggerSave(check.ErrorType, null);
  140. }
  141. });
  142. }
  143. else
  144. {
  145. S_TileMap.Instance.TriggerSave(check.ErrorType, null);
  146. }
  147. }
  148.  
  149. //点击返回
  150. private void OnBackClick()
  151. {
  152. S_TileMap.Instance.TryRunCheckHandler();
  153. if (S_TileMap.Instance.IsDirty) //有修改的数据, 不能直接退出, 需要询问用户是否保存
  154. {
  155. EditorWindowManager.ShowConfirm("提示", "当前房间修改的数据还未保存,是否退出编辑房间?",
  156. "保存并退出", "直接退出", "取消"
  157. , index =>
  158. {
  159. if (index == 0) //保存并退出
  160. {
  161. var check = CheckError();
  162. if (check.HasError) //有错误
  163. {
  164. EditorWindowManager.ShowConfirm("提示", EditorTileMapManager.GetRoomErrorTypeMessage(check.ErrorType) + ",如果现在保存并退出,运行游戏将不会刷出该房间!\n是否仍要保存?", (v) =>
  165. {
  166. if (v)
  167. {
  168. S_TileMap.Instance.TriggerSave(check.ErrorType, () =>
  169. {
  170. //返回上一个Ui
  171. OpenPrevUi();
  172. });
  173. }
  174. else
  175. {
  176. //返回上一个Ui
  177. OpenPrevUi();
  178. }
  179. });
  180. }
  181. else //没有错误
  182. {
  183. S_TileMap.Instance.TriggerSave(check.ErrorType, () =>
  184. {
  185. //返回上一个Ui
  186. OpenPrevUi();
  187. });
  188. }
  189. }
  190. else if (index == 1)
  191. {
  192. //返回上一个Ui
  193. OpenPrevUi();
  194. }
  195. });
  196. }
  197. else //没有修改数据
  198. {
  199. var check = CheckError();
  200. if (check.HasError) //有错误
  201. {
  202. EditorWindowManager.ShowConfirm("提示", EditorTileMapManager.GetRoomErrorTypeMessage(check.ErrorType) + ",如果不解决错误就退出,运行游戏将不会刷出该房间!\n是否仍要退出?", (v) =>
  203. {
  204. if (v)
  205. {
  206. //返回上一个Ui
  207. OpenPrevUi();
  208. }
  209. });
  210. }
  211. else //没有错误
  212. {
  213. //返回上一个Ui
  214. OpenPrevUi();
  215. }
  216. }
  217. }
  218.  
  219. private CheckResult CheckError()
  220. {
  221. var editorTileMap = S_TileMap.Instance;
  222. if (editorTileMap.CurrRoomSize == Vector2I.Zero)
  223. {
  224. return new CheckResult(true, RoomErrorType.Empty);
  225. }
  226. else if (editorTileMap.HasTerrainError) //地图绘制错误
  227. {
  228. return new CheckResult(true, RoomErrorType.TileError);
  229. }
  230.  
  231. if (editorTileMap.CurrDoorConfigs.Count > 0)
  232. {
  233. var flag = false;
  234. var dir = -1;
  235. foreach (var roomInfoDoorAreaInfo in editorTileMap.CurrDoorConfigs)
  236. {
  237. if (dir == -1)
  238. {
  239. dir = (int)roomInfoDoorAreaInfo.Direction;
  240. }
  241. else if (dir != (int)roomInfoDoorAreaInfo.Direction)
  242. {
  243. flag = true;
  244. break;
  245. }
  246. }
  247.  
  248. if (!flag)
  249. {
  250. return new CheckResult(true, RoomErrorType.DoorAreaError);
  251. }
  252. }
  253. if (EditorTileMapManager.SelectRoom.Preinstall == null || EditorTileMapManager.SelectRoom.Preinstall.Count == 0)
  254. {
  255. return new CheckResult(true, RoomErrorType.NoPreinstallError);
  256. }
  257. return new CheckResult(false, RoomErrorType.None);
  258. }
  259. }