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