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