Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / serialize / tileSet / TileSetSplit.cs
@小李xl 小李xl on 8 Jan 2024 6 KB 生成Godot.TileSet, 开发中
  1.  
  2. using System.Collections.Generic;
  3. using System.Text.Json;
  4. using System.Text.Json.Serialization;
  5. using Godot;
  6.  
  7. public class TileSetSplit : IDestroy
  8. {
  9. [JsonIgnore]
  10. public bool IsDestroyed { get; private set; }
  11. /// <summary>
  12. /// 错误类型
  13. /// </summary>
  14. [JsonInclude]
  15. public int ErrorType;
  16.  
  17. /// <summary>
  18. /// 路径
  19. /// </summary>
  20. [JsonInclude]
  21. public string Path;
  22.  
  23. /// <summary>
  24. /// 备注
  25. /// </summary>
  26. [JsonInclude]
  27. public string Remark;
  28.  
  29. /// <summary>
  30. /// 图块集路径
  31. /// </summary>
  32. [JsonIgnore]
  33. public string TileSetPath => Path + "/TileSet.json";
  34.  
  35. /// <summary>
  36. /// 图块集信息
  37. /// </summary>
  38. [JsonIgnore]
  39. public TileSetInfo TileSetInfo
  40. {
  41. get
  42. {
  43. if (_tileSetInfo == null && TileSetPath != null)
  44. {
  45. ReloadTileSetInfo();
  46. }
  47.  
  48. return _tileSetInfo;
  49. }
  50. }
  51.  
  52. private TileSetInfo _tileSetInfo;
  53. private TileSet _tileSet;
  54.  
  55. /// <summary>
  56. /// 设置图块集信息
  57. /// </summary>
  58. public void SetTileSetInfo(TileSetInfo info)
  59. {
  60. if (_tileSetInfo != null)
  61. {
  62. _tileSetInfo.Destroy();
  63. }
  64.  
  65. if (_tileSet != null)
  66. {
  67. _tileSet.Dispose();
  68. _tileSet = null;
  69. }
  70. _tileSetInfo = info;
  71. }
  72.  
  73. /// <summary>
  74. /// 重新加载图块集信息
  75. /// </summary>
  76. public void ReloadTileSetInfo()
  77. {
  78. var asText = ResourceManager.LoadText("res://" + TileSetPath);
  79. _tileSetInfo = JsonSerializer.Deserialize<TileSetInfo>(asText);
  80. }
  81.  
  82. /// <summary>
  83. /// 获取由该对象生成的Godot.TileSet对象
  84. /// </summary>
  85. public TileSet GetTileSet()
  86. {
  87. if (_tileSet != null)
  88. {
  89. return _tileSet;
  90. }
  91.  
  92. if (TileSetInfo == null)
  93. {
  94. return null;
  95. }
  96. _tileSet = new TileSet();
  97. if (_tileSetInfo.Sources != null)
  98. {
  99. //TileSet网格大小
  100. _tileSet.TileSize = GameConfig.TileCellSizeVector2I;
  101. //物理层 0
  102. _tileSet.AddPhysicsLayer();
  103. _tileSet.SetPhysicsLayerCollisionLayer(0, PhysicsLayer.Wall);
  104. _tileSet.SetPhysicsLayerCollisionMask(0, PhysicsLayer.Wall);
  105. Debug.Log("GetPhysicsLayersCount: " + _tileSet.GetPhysicsLayersCount());
  106. //地形层 0
  107. _tileSet.AddTerrainSet();
  108. _tileSet.SetTerrainSetMode(0, TileSet.TerrainMode.CornersAndSides);
  109. _tileSet.AddTerrain(0);
  110. //Source资源
  111. foreach (var tileSetSourceInfo in _tileSetInfo.Sources)
  112. {
  113. var tileSetAtlasSource = new TileSetAtlasSource();
  114. //纹理
  115. var image = tileSetSourceInfo.GetSourceImage();
  116. tileSetAtlasSource.Texture = ImageTexture.CreateFromImage(image);
  117. var size = image.GetSize() / GameConfig.TileCellSize;
  118. //创建cell
  119. for (var i = 0; i < size.X; i++)
  120. {
  121. for (var j = 0; j < size.Y; j++)
  122. {
  123. tileSetAtlasSource.CreateTile(new Vector2I(i, j));
  124. }
  125. }
  126. var terrainInfo = tileSetSourceInfo.Terrain;
  127. //初始化地形
  128. tileSetAtlasSource.InitTerrain(terrainInfo, 0, 0);
  129. //ySort
  130. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 2), 23);
  131. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), 23);
  132. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), 23);
  133. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), 23);
  134. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), 23);
  135. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), 23);
  136. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), 23);
  137. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), 23);
  138.  
  139. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), 23);
  140. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), 23);
  141.  
  142. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), 23);
  143. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), 23);
  144. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), 23);
  145. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), 7);
  146. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), 7);
  147. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), 7);
  148. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), 7);
  149. //碰撞器
  150. var index = terrainInfo.TerrainCoordsToIndex(new Vector2I(0, 0), 1);
  151. var cellData = terrainInfo.GetTerrainBit(index, 1);
  152. var pos = terrainInfo.GetPosition(cellData);
  153. var tileData = tileSetAtlasSource.GetTileData(pos, 0);
  154. tileData.AddCollisionPolygon(0);
  155. tileData.SetCollisionPolygonPoints(0, 0, new []
  156. {
  157. new Vector2(0, 0),
  158. new Vector2(8, 0),
  159. new Vector2(8, 8),
  160. new Vector2(0, 8),
  161. });
  162.  
  163. _tileSet.AddSource(tileSetAtlasSource);
  164. }
  165. }
  166.  
  167. return _tileSet;
  168. }
  169.  
  170. private static void SetAtlasSourceYSortOrigin(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I coords, int ySortOrigin)
  171. {
  172. var index = terrainInfo.TerrainCoordsToIndex(coords, type);
  173. var cellData = terrainInfo.GetTerrainBit(index, type);
  174. if (cellData != null)
  175. {
  176. var pos = terrainInfo.GetPosition(cellData);
  177. var tileData = tileSetAtlasSource.GetTileData(pos, 0);
  178. tileData.YSortOrigin = ySortOrigin;
  179. }
  180. }
  181.  
  182. public void Destroy()
  183. {
  184. if (IsDestroyed) return;
  185. IsDestroyed = true;
  186. if (_tileSetInfo != null)
  187. {
  188. _tileSetInfo.Destroy();
  189. }
  190. if (_tileSet != null)
  191. {
  192. _tileSet.Dispose();
  193. }
  194. }
  195. }