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