Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / tileSet / TerrainPeering.cs
@小李xl 小李xl on 14 Jan 2024 4 KB 添加TileSet错误红点
  1.  
  2. using Godot;
  3.  
  4. /// <summary>
  5. /// 地形掩码
  6. /// </summary>
  7. public static class TerrainPeering
  8. {
  9. /// <summary>
  10. /// 无
  11. /// </summary>
  12. public const uint None = 0;
  13. /// <summary>
  14. /// 左上
  15. /// </summary>
  16. public const uint LeftTop = 0b1;
  17. /// <summary>
  18. /// 上
  19. /// </summary>
  20. public const uint Top = 0b10;
  21. /// <summary>
  22. /// 右上
  23. /// </summary>
  24. public const uint RightTop = 0b100;
  25. /// <summary>
  26. /// 左
  27. /// </summary>
  28. public const uint Left = 0b1000;
  29. /// <summary>
  30. /// 中心
  31. /// </summary>
  32. public const uint Center = 0b10000;
  33. /// <summary>
  34. /// 右
  35. /// </summary>
  36. public const uint Right = 0b100000;
  37. /// <summary>
  38. /// 左下
  39. /// </summary>
  40. public const uint LeftBottom = 0b1000000;
  41. /// <summary>
  42. /// 下
  43. /// </summary>
  44. public const uint Bottom = 0b10000000;
  45. /// <summary>
  46. /// 右下
  47. /// </summary>
  48. public const uint RightBottom = 0b100000000;
  49.  
  50. /// <summary>
  51. /// 获取地形掩码值
  52. /// </summary>
  53. public static uint GetTerrainPeeringValue(this TileData tileData)
  54. {
  55. if (tileData.Terrain != -1 && tileData.TerrainSet != -1)
  56. {
  57. var value = Center;
  58. if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopLeftCorner) >= 0)
  59. value |= LeftTop;
  60. if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopSide) >= 0)
  61. value |= Top;
  62. if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.TopRightCorner) >= 0)
  63. value |= RightTop;
  64. if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.LeftSide) >= 0)
  65. value |= Left;
  66. if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.RightSide) >= 0)
  67. value |= Right;
  68. if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomLeftCorner) >= 0)
  69. value |= LeftBottom;
  70. if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomSide) >= 0)
  71. value |= Bottom;
  72. if (tileData.GetTerrainPeeringBit(TileSet.CellNeighbor.BottomRightCorner) >= 0)
  73. value |= RightBottom;
  74. return value;
  75. }
  76.  
  77. return None;
  78. }
  79.  
  80. /// <summary>
  81. /// 将地形掩码数据设置到 TileSetAtlasSource 中
  82. /// </summary>
  83. public static void InitTerrain(this TileSetAtlasSource atlasSource, TileSetTerrainInfo terrainInfo, int terrainSet, int terrain)
  84. {
  85. foreach (var keyValuePair in terrainInfo.T)
  86. {
  87. var pos = terrainInfo.GetPosition(keyValuePair.Value);
  88. var tileData = atlasSource.GetTileData(pos, 0);
  89. if (tileData == null)
  90. {
  91. continue;
  92. }
  93. tileData.TerrainSet = terrainSet;
  94. tileData.Terrain = terrain;
  95. var bit = keyValuePair.Key;
  96. if (terrainInfo.TerrainType == 0) //3x3地形
  97. {
  98. if ((bit & LeftTop) != 0)
  99. {
  100. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.TopLeftCorner, 0);
  101. }
  102. if ((bit & Top) != 0)
  103. {
  104. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.TopSide, 0);
  105. }
  106. if ((bit & RightTop) != 0)
  107. {
  108. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.TopRightCorner, 0);
  109. }
  110. if ((bit & Left) != 0)
  111. {
  112. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.LeftSide, 0);
  113. }
  114. if ((bit & Right) != 0)
  115. {
  116. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.RightSide, 0);
  117. }
  118. if ((bit & LeftBottom) != 0)
  119. {
  120. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.BottomLeftCorner, 0);
  121. }
  122. if ((bit & Bottom) != 0)
  123. {
  124. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.BottomSide, 0);
  125. }
  126. if ((bit & RightBottom) != 0)
  127. {
  128. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.BottomRightCorner, 0);
  129. }
  130. }
  131. else //2x2地形
  132. {
  133. if ((bit & LeftTop) != 0)
  134. {
  135. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.TopLeftCorner, 0);
  136. }
  137. if ((bit & RightTop) != 0)
  138. {
  139. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.TopRightCorner, 0);
  140. }
  141. if ((bit & LeftBottom) != 0)
  142. {
  143. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.BottomLeftCorner, 0);
  144. }
  145. if ((bit & RightBottom) != 0)
  146. {
  147. tileData.SetTerrainPeeringBit(TileSet.CellNeighbor.BottomRightCorner, 0);
  148. }
  149. }
  150. }
  151. }
  152. }