Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / ui / tileSetEditorTerrain / TileSetEditorTerrainPanel.cs
@小李xl 小李xl on 11 Jan 2024 9 KB 制作2x2地形,还有bug
  1. using Godot;
  2. using UI.TileSetEditor;
  3.  
  4. namespace UI.TileSetEditorTerrain;
  5.  
  6. public partial class TileSetEditorTerrainPanel : TileSetEditorTerrain
  7. {
  8. /// <summary>
  9. /// 父Ui
  10. /// </summary>
  11. public TileSetEditorPanel EditorPanel;
  12. /// <summary>
  13. /// 正在拖拽的图块
  14. /// </summary>
  15. public MaskCell DraggingCell { get; set; }
  16.  
  17. public UiGrid<RightCell, byte> TerrainGrid3x3;
  18. public UiGrid<RightCell, byte> TerrainGrid2x2;
  19. public UiGrid<RightCell, byte> TerrainGridMiddle;
  20. public UiGrid<RightCell, byte> TerrainGridFloor;
  21. public UiGrid<BottomCell, Rect2I> MaskGrid;
  22.  
  23. private bool _refreshGridConnect = false;
  24.  
  25. public override void OnCreateUi()
  26. {
  27. EditorPanel = (TileSetEditorPanel)ParentUi;
  28. S_DragSprite.Instance.Visible = false;
  29. //改变选中的TileSet资源
  30. AddEventListener(EventEnum.OnSelectTileSetSource, OnSelectTileSetSource);
  31. //改变纹理事件
  32. AddEventListener(EventEnum.OnSetTileTexture, OnSetTileTexture);
  33. //背景颜色改变
  34. AddEventListener(EventEnum.OnSetTileSetBgColor, OnChangeTileSetBgColor);
  35. MaskGrid = CreateUiGrid<BottomCell, Rect2I, MaskCell>(S_BottomCell);
  36. MaskGrid.SetCellOffset(Vector2I.Zero);
  37. MaskGrid.GridContainer.MouseFilter = MouseFilterEnum.Ignore;
  38.  
  39. TerrainGrid3x3 = InitTopGrid(S_TerrainRoot.L_TerrainTexture1.Instance, GameConfig.TerrainBit3x3, TileSetTerrainInfo.TerrainLayerType);
  40. TerrainGrid2x2 = InitTopGrid(S_TerrainRoot.L_TerrainTexture4.Instance, GameConfig.TerrainBit2x2, TileSetTerrainInfo.TerrainLayerType);
  41. TerrainGridMiddle = InitTopGrid(S_TerrainRoot.L_TerrainTexture2.Instance, GameConfig.TerrainBitMiddle, TileSetTerrainInfo.MiddleLayerType);
  42. TerrainGridFloor = InitTopGrid(S_TerrainRoot.L_TerrainTexture3.Instance, GameConfig.TerrainBitFloor, TileSetTerrainInfo.FloorLayerType);
  43.  
  44. OnSetTileTexture(EditorPanel.Texture);
  45. OnChangeTileSetBgColor(EditorPanel.BgColor);
  46. }
  47.  
  48. public override void OnDestroyUi()
  49. {
  50. }
  51.  
  52. public override void Process(float delta)
  53. {
  54. S_MaskBrush.Instance.Visible = DraggingCell == null;
  55.  
  56. if (_refreshGridConnect)
  57. {
  58. _refreshGridConnect = false;
  59.  
  60. var terrain = EditorPanel.TileSetSourceInfo.Terrain;
  61. TerrainGrid3x3.ForEach(cell => RefreshConnectTerrainCell(terrain, cell));
  62. if (EditorPanel.TileSetSourceIndex == 0) //必须选中Main Source
  63. {
  64. TerrainGridMiddle.ForEach(cell => RefreshConnectTerrainCell(terrain, cell));
  65. TerrainGridFloor.ForEach(cell => RefreshConnectTerrainCell(terrain, cell));
  66. }
  67. }
  68. }
  69.  
  70. private UiGrid<RightCell, byte> InitTopGrid(Control texture, Vector2I size, byte type)
  71. {
  72. var cellRoot = S_TopBg.L_TerrainRoot.L_CellRoot;
  73. var sRightCell = cellRoot.L_RightCell;
  74. sRightCell.Instance.Position = texture.Position;
  75. var grid = CreateUiGrid<RightCell, byte, TerrainCell>(sRightCell, cellRoot.Instance);
  76. grid.SetCellOffset(Vector2I.Zero);
  77. grid.SetColumns(size.X);
  78. for (var y = 0; y < size.Y; y++)
  79. {
  80. for (var x = 0; x < size.X; x++)
  81. {
  82. grid.Add(type);
  83. }
  84. }
  85. return grid;
  86. }
  87.  
  88. //改变选中的TileSet资源
  89. private void OnSelectTileSetSource(object obj)
  90. {
  91. //清除所有绑定的Terrain
  92. TerrainGrid3x3.ForEach(cell => ((TerrainCell)cell).ClearCell());
  93. TerrainGridMiddle.ForEach(cell => ((TerrainCell)cell).ClearCell());
  94. TerrainGridFloor.ForEach(cell => ((TerrainCell)cell).ClearCell());
  95. TerrainGrid2x2.ForEach(cell => ((TerrainCell)cell).ClearCell());
  96. S_TopBg.Instance.SetHoverCell(null);
  97. S_BottomBg.Instance.SetHoverCell(null);
  98.  
  99. var sourceIndex = EditorPanel.TileSetSourceIndex;
  100. if (sourceIndex == 0) //选中Main Source时就只能使用 47 Terrain
  101. {
  102. S_TerrainTexture2.Instance.Visible = true;
  103. S_TerrainTexture3.Instance.Visible = true;
  104. TerrainGridMiddle.Visible = true;
  105. TerrainGridFloor.Visible = true;
  106. S_TerrainTexture1.L_Label.Instance.Text = "顶部墙壁";
  107. S_TerrainTypeButton.Instance.Visible = false;
  108. S_TerrainTypeButton.Instance.Selected = 0;
  109. S_TopBg.Instance.ChangeTerrainType(0, false);
  110. }
  111. else
  112. {
  113. S_TerrainTexture2.Instance.Visible = false;
  114. S_TerrainTexture3.Instance.Visible = false;
  115. TerrainGridMiddle.Visible = false;
  116. TerrainGridFloor.Visible = false;
  117. S_TerrainTexture1.L_Label.Instance.Text = "地形";
  118. S_TerrainTypeButton.Instance.Visible = true;
  119. var selectIndex = EditorPanel.TileSetSourceInfo.Terrain.TerrainType;
  120. S_TerrainTypeButton.Instance.Selected = selectIndex;
  121. S_TopBg.Instance.ChangeTerrainType(selectIndex, false);
  122. }
  123. //再加载Terrain
  124. if (obj != null)
  125. {
  126. var terrain = ((TileSetSourceInfo)obj).Terrain;
  127. if (sourceIndex == 0) //选中Main Source
  128. {
  129. TerrainGrid3x3.ForEach(cell => SetTerrainCellData(terrain, cell));
  130. TerrainGridMiddle.ForEach(cell => SetTerrainCellData(terrain, cell));
  131. TerrainGridFloor.ForEach(cell => SetTerrainCellData(terrain, cell));
  132. }
  133. else if (S_TerrainTypeButton.Instance.Selected == 0) //选中47个Terrain
  134. {
  135. TerrainGrid3x3.ForEach(cell => SetTerrainCellData(terrain, cell));
  136. }
  137. else //选中13格Terrain
  138. {
  139. TerrainGrid2x2.ForEach(cell => SetTerrainCellData(terrain, cell));
  140. }
  141. }
  142. }
  143.  
  144. private void SetTerrainCellData(TileSetTerrainInfo terrain, UiCell<RightCell, byte> cell)
  145. {
  146. var data = terrain.GetTerrainCell(cell.Index, cell.Data);
  147. if (data != null)
  148. {
  149. var terrainCell = (TerrainCell)cell;
  150. var x = data[0];
  151. var y = data[1];
  152. terrainCell.SetCell(new Rect2I(x, y, GameConfig.TileCellSize, GameConfig.TileCellSize));
  153. }
  154. }
  155. private void RefreshConnectTerrainCell(TileSetTerrainInfo terrain, UiCell<RightCell, byte> cell)
  156. {
  157. var data = terrain.GetTerrainCell(cell.Index, cell.Data);
  158. if (data != null)
  159. {
  160. var terrainCell = (TerrainCell)cell;
  161. var x = data[0];
  162. var y = data[1];
  163. var index = x / GameConfig.TileCellSize + y / GameConfig.TileCellSize * MaskGrid.GetColumns();
  164. var maskCell = (MaskCell)MaskGrid.GetCell(index);
  165. if (maskCell != null)
  166. {
  167. //绑定TerrainCell
  168. maskCell.SetConnectTerrainCell(terrainCell);
  169. }
  170. }
  171. }
  172.  
  173. /// <summary>
  174. /// 放置地形Cell纹理
  175. /// </summary>
  176. public void OnDropCell(MaskCell maskCell)
  177. {
  178. if (EditorPanel.TileSetSourceIndex == 0) //选中Main Source
  179. {
  180. var flag = true;
  181. TerrainGrid3x3.ForEach((cell) =>
  182. {
  183. flag = !((TerrainCell)cell).OnDropCell(maskCell);
  184. return flag;
  185. });
  186. if (flag)
  187. {
  188. TerrainGridMiddle.ForEach((cell) =>
  189. {
  190. flag = !((TerrainCell)cell).OnDropCell(maskCell);
  191. return flag;
  192. });
  193. }
  194. if (flag)
  195. {
  196. TerrainGridFloor.ForEach((cell) =>
  197. {
  198. return ((TerrainCell)cell).OnDropCell(maskCell);
  199. });
  200. }
  201. }
  202. else if (S_TerrainTypeButton.Instance.Selected == 0) //选中47个Terrain
  203. {
  204. TerrainGrid3x3.ForEach((cell) =>
  205. {
  206. return !((TerrainCell)cell).OnDropCell(maskCell);
  207. });
  208. }
  209. else //选中13格Terrain
  210. {
  211. TerrainGrid2x2.ForEach((cell) =>
  212. {
  213. return !((TerrainCell)cell).OnDropCell(maskCell);
  214. });
  215. }
  216. }
  217. //改变TileSet纹理
  218. private void OnSetTileTexture(object arg)
  219. {
  220. S_BottomBg.Instance.OnChangeTileSetTexture();
  221.  
  222. MaskGrid.RemoveAll();
  223. var cellHorizontal = EditorPanel.CellHorizontal;
  224. if (cellHorizontal <= 0)
  225. {
  226. return;
  227. }
  228. var cellVertical = EditorPanel.CellVertical;
  229. MaskGrid.SetColumns(cellHorizontal);
  230. for (var y = 0; y < cellVertical; y++)
  231. {
  232. for (var x = 0; x < cellHorizontal; x++)
  233. {
  234. MaskGrid.Add(new Rect2I(x * GameConfig.TileCellSize, y * GameConfig.TileCellSize, GameConfig.TileCellSize, GameConfig.TileCellSize));
  235. }
  236. }
  237.  
  238. _refreshGridConnect = true;
  239. }
  240. //更改背景颜色
  241. private void OnChangeTileSetBgColor(object obj)
  242. {
  243. S_BottomBg.Instance.Color = EditorPanel.BgColor;
  244. S_TopBg.Instance.Color = EditorPanel.BgColor;
  245. }
  246. }