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