Newer
Older
DungeonShooting / DungeonShooting_Godot / src / test / TestNewTerrain.cs
@小李xl 小李xl on 26 Dec 2023 4 KB 地牢新版地形开发中
  1. using Godot;
  2. using System;
  3.  
  4. /// <summary>
  5. /// 测试动态烘焙导航网格
  6. /// </summary>
  7. public partial class TestNewTerrain : Node2D
  8. {
  9. private TileMap _tileMap;
  10. private Vector2[][] _polygonData;
  11. private NavigationRegion2D _navigationRegion;
  12. public override void _Ready()
  13. {
  14. Visible = false;
  15. _tileMap = GetNode<TileMap>("TileMap2");
  16. _navigationRegion = GetNode<NavigationRegion2D>("TileMap2/NavigationRegion2D");
  17. _navigationRegion.BakeFinished += BakeFinished;
  18. RunTest();
  19.  
  20. var tileSet = _tileMap.TileSet;
  21. var terrainSetsCount = tileSet.GetTerrainSetsCount();
  22. Debug.Log($"terrainSetsCount: {terrainSetsCount}");
  23. for (var i = 0; i < terrainSetsCount; i++)
  24. {
  25. Debug.Log("----------------------------------------------------");
  26. var count = tileSet.GetTerrainsCount(i);
  27. Debug.Log($"terrainSet: {i} - {count} - {tileSet.GetTerrainSetMode(i)}");
  28. for (int j = 0; j < count; j++)
  29. {
  30. var terrainName = tileSet.GetTerrainName(i, j);
  31. Debug.Log($"terrainName: {terrainName}");
  32. }
  33. }
  34. var tileSetSource = tileSet.GetSource(0);
  35. if (tileSetSource is TileSetAtlasSource atlasSource)
  36. {
  37. var tilesCount = tileSetSource.GetTilesCount();
  38. for (int i = 0; i < tilesCount; i++)
  39. {
  40. var pos = tileSetSource.GetTileId(i);
  41. var tileData = atlasSource.GetTileData(pos, 0);
  42. Debug.Log($"pos: {pos}, terrain: {tileData.Terrain}, terrainSet: {tileData.TerrainSet}, peering: {tileData.GetTerrainPeeringValue() & TerrainPeering.Top}");
  43. if (tileData.Terrain != -1 && tileData.TerrainSet != -1)
  44. {
  45. var str = "";
  46. str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopLeftCorner) + 1).ToString();
  47. str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopSide) + 1).ToString();
  48. str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopRightCorner) + 1).ToString() + "\n";
  49. str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.LeftSide) + 1).ToString();
  50. str += "1";
  51. str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.RightSide) + 1).ToString() + "\n";
  52. str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomLeftCorner) + 1).ToString();
  53. str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomSide) + 1).ToString();
  54. str += (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomRightCorner) + 1).ToString();
  55. GD.Print(str);
  56. }
  57. else
  58. {
  59. GD.Print("000\n000\n000");
  60. }
  61. }
  62. }
  63.  
  64. }
  65.  
  66. private void BakeFinished()
  67. {
  68. var polygonData = _navigationRegion.NavigationPolygon;
  69. var polygons = polygonData.Polygons;
  70. var vertices = polygonData.Vertices;
  71. _polygonData = new Vector2[polygons.Count][];
  72. for (var i = 0; i < polygons.Count; i++)
  73. {
  74. var polygon = polygons[i];
  75. var v2Array = new Vector2[polygon.Length];
  76. for (var j = 0; j < polygon.Length; j++)
  77. {
  78. v2Array[j] = vertices[polygon[j]];
  79. }
  80. _polygonData[i] = v2Array;
  81. }
  82. }
  83.  
  84. public override void _Process(double delta)
  85. {
  86. QueueRedraw();
  87. }
  88.  
  89. public override void _Draw()
  90. {
  91. if (_polygonData != null)
  92. {
  93. //Utils.DrawNavigationPolygon(this, _polygonData);
  94. foreach (var vector2s in _polygonData)
  95. {
  96. DrawPolygon(vector2s, new Color(1, 1, 0, 0.3f).MakeArray(vector2s.Length));
  97. }
  98. }
  99. }
  100.  
  101. private void RunTest()
  102. {
  103. var usedRect = _tileMap.GetUsedRect();
  104. var data = new NavigationPolygon();
  105. data.SourceGeometryMode = NavigationPolygon.SourceGeometryModeEnum.GroupsWithChildren;
  106. data.SourceGeometryGroupName = "navigation";
  107. data.CellSize = 4;
  108. data.AgentRadius = 6.5f;
  109. data.AddOutline(new []
  110. {
  111. usedRect.Position * GameConfig.TileCellSize,
  112. new Vector2(usedRect.End.X, usedRect.Position.Y) * GameConfig.TileCellSize,
  113. usedRect.End * GameConfig.TileCellSize,
  114. new Vector2(usedRect.Position.X, usedRect.End.Y) * GameConfig.TileCellSize
  115. });
  116. _navigationRegion.NavigationPolygon = data;
  117. _navigationRegion.BakeNavigationPolygon(false);
  118. }
  119. }