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. //临时处理, 加载TileSet
  28. var tileSet = ResourceManager.Load<TileSet>(ResourcePath.resource_map_tileSet_map1_TileSet1_tres);
  29. var tileSetAtlasSource = (TileSetAtlasSource)tileSet.GetSource(0);
  30. tileSetAtlasSource.Texture = ImageTexture.CreateFromImage(Image.LoadFromFile("resource/map/tileSprite/map1/16x16 dungeon ii wall reconfig v04 spritesheet.png"));
  31. S_TileMap.Instance.TileSet = tileSet;
  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. EditorManager.SetSelectMark(null);
  50. //清除选中的波
  51. EditorManager.SetSelectWaveIndex(-1);
  52. //清除选中的预设
  53. EditorManager.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("提示", EditorManager.GetRoomErrorTypeMessage(check.ErrorType) + ",不能运行房间!");
  65. return;
  66. }
  67. //保存数据
  68. S_TileMap.Instance.TriggerSave(RoomErrorType.None, () =>
  69. {
  70. var groupName = EditorManager.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("提示", EditorManager.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("提示", EditorManager.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("提示", EditorManager.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 (EditorManager.SelectRoom.Preinstall == null || EditorManager.SelectRoom.Preinstall.Count == 0)
  242. {
  243. return new CheckResult(true, RoomErrorType.NoPreinstallError);
  244. }
  245. return new CheckResult(false, RoomErrorType.None);
  246. }
  247. }