Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / mapEditorCreateRoom / MapEditorCreateRoomPanel.cs
@小李xl 小李xl on 25 Dec 2023 5 KB TileMap保存和读取导航网格
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Text.RegularExpressions;
  5. using Godot;
  6.  
  7. namespace UI.MapEditorCreateRoom;
  8.  
  9. public partial class MapEditorCreateRoomPanel : MapEditorCreateRoom
  10. {
  11. //编辑模式下的原数据
  12. private DungeonRoomSplit _roomSplit;
  13. //key: 组名称, value: 选项索引
  14. private Dictionary<string, int> _groupMap = new Dictionary<string, int>();
  15.  
  16. public override void OnCreateUi()
  17. {
  18. //初始化选项
  19. var groupButton = S_GroupSelect.Instance;
  20. var index = 0;
  21. foreach (var mapGroupInfo in MapProjectManager.GroupMap)
  22. {
  23. var id = index++;
  24. var groupGroupName = mapGroupInfo.Value.GroupName;
  25. _groupMap.Add(groupGroupName, id);
  26. groupButton.AddItem(groupGroupName, id);
  27. }
  28.  
  29. var selectButton = S_TypeSelect.Instance;
  30. var roomTypes = Enum.GetValues<DungeonRoomType>();
  31. for (var i = 0; i < roomTypes.Length; i++)
  32. {
  33. var item = roomTypes[i];
  34. var text = DungeonManager.DungeonRoomTypeToDescribeString(item);
  35. selectButton.AddItem(text, (int)item);
  36. }
  37. }
  38.  
  39. /// <summary>
  40. /// 初始化数据, 用于编辑房间
  41. /// </summary>
  42. /// <param name="roomSplit"></param>
  43. public void InitEditData(DungeonRoomSplit roomSplit)
  44. {
  45. _roomSplit = roomSplit;
  46. //房间名称
  47. S_RoomNameInput.Instance.Text = roomSplit.RoomInfo.RoomName;
  48. //权重
  49. S_WeightInput.Instance.Value = roomSplit.RoomInfo.Weight;
  50. //备注
  51. S_RemarkInput.Instance.Text = roomSplit.RoomInfo.Remark;
  52. //所在的组
  53. SetSelectGroup(roomSplit.RoomInfo.GroupName);
  54. //房间类型
  55. SetSelectType((int)roomSplit.RoomInfo.RoomType);
  56. //不可编辑
  57. S_RoomNameInput.Instance.Editable = false;
  58. S_GroupSelect.Instance.Disabled = true;
  59. S_TypeSelect.Instance.Disabled = true;
  60. }
  61. /// <summary>
  62. /// 设置选中的组
  63. /// </summary>
  64. public void SetSelectGroup(string groupName)
  65. {
  66. if (_groupMap.TryGetValue(groupName, out var value))
  67. {
  68. S_GroupSelect.Instance.Selected = value;
  69. return;
  70. }
  71. S_GroupSelect.Instance.Selected = -1;
  72. }
  73.  
  74. /// <summary>
  75. /// 设置选中的房间类型
  76. /// </summary>
  77. public void SetSelectType(int index)
  78. {
  79. S_TypeSelect.Instance.Selected = index;
  80. }
  81.  
  82. /// <summary>
  83. /// 填完数据后获取数据对象, 并进行验证, 如果验证失败, 则返回 null
  84. /// </summary>
  85. public DungeonRoomSplit GetRoomInfo()
  86. {
  87. if (_roomSplit != null) //修改数据
  88. {
  89. var roomInfo = _roomSplit.RoomInfo;
  90. roomInfo.Remark = S_RemarkInput.Instance.Text;
  91. roomInfo.Weight = (int)S_WeightInput.Instance.Value;
  92. return _roomSplit;
  93. }
  94. else
  95. {
  96. var roomInfo = new DungeonRoomInfo();
  97. roomInfo.RoomName = S_RoomNameInput.Instance.Text;
  98. roomInfo.Remark = S_RemarkInput.Instance.Text;
  99. roomInfo.RoomType = (DungeonRoomType)S_TypeSelect.Instance.GetSelectedId();
  100. roomInfo.Weight = (int)S_WeightInput.Instance.Value;
  101.  
  102. //检查名称是否合规
  103. if (string.IsNullOrEmpty(roomInfo.RoomName))
  104. {
  105. EditorWindowManager.ShowTips("错误", "房间名称不能为空!");
  106. return null;
  107. }
  108. var groupIndex = S_GroupSelect.Instance.Selected;
  109. foreach (var pair in _groupMap)
  110. {
  111. if (pair.Value == groupIndex)
  112. {
  113. roomInfo.GroupName = pair.Key;
  114. }
  115. }
  116.  
  117. if (roomInfo.GroupName == null)
  118. {
  119. EditorWindowManager.ShowTips("错误", "组名错误!");
  120. return null;
  121. }
  122. //检测是否有同名房间
  123. var temp = roomInfo.GroupName + "/" + DungeonManager.DungeonRoomTypeToString(roomInfo.RoomType) + "/" + roomInfo.RoomName;
  124. var dirPath = MapProjectManager.CustomMapPath + temp;
  125. var dir = new DirectoryInfo(dirPath);
  126. if (dir.Exists && dir.GetFiles().Length > 0)
  127. {
  128. EditorWindowManager.ShowTips("错误", $"已经有相同路径的房间了!\n路径: {temp}");
  129. return null;
  130. }
  131. roomInfo.Size = new SerializeVector2();
  132. roomInfo.Position = new SerializeVector2();
  133. roomInfo.DoorAreaInfos = new List<DoorAreaInfo>();
  134.  
  135. var roomSplit = new DungeonRoomSplit();
  136. roomSplit.ErrorType = RoomErrorType.Empty;
  137. roomSplit.Path = dirPath;
  138. roomSplit.RoomInfo = roomInfo;
  139.  
  140. var tileInfo = new DungeonTileInfo();
  141. tileInfo.NavigationVertices = new List<SerializeVector2>();
  142. tileInfo.NavigationPolygon = new List<int[]>();
  143. tileInfo.Floor = new List<int>();
  144. tileInfo.Middle = new List<int>();
  145. tileInfo.Top = new List<int>();
  146.  
  147. roomSplit.TileInfo = tileInfo;
  148. roomSplit.Preinstall = new List<RoomPreinstallInfo>();
  149. return roomSplit;
  150. }
  151. }
  152. }