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