Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / serialize / tileSet / TileSetSplit.cs
@小李xl 小李xl on 9 Jan 2024 14 KB 存储和读取房间Tile数据
  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. if (_tileSet != null)
  81. {
  82. _tileSet.Dispose();
  83. _tileSet = null;
  84. }
  85. }
  86.  
  87. /// <summary>
  88. /// 获取由该对象生成的Godot.TileSet对象
  89. /// </summary>
  90. public TileSet GetTileSet()
  91. {
  92. if (_tileSet != null)
  93. {
  94. return _tileSet;
  95. }
  96.  
  97. if (TileSetInfo == null)
  98. {
  99. return null;
  100. }
  101. _tileSet = new TileSet();
  102. if (_tileSetInfo.Sources != null)
  103. {
  104. //TileSet网格大小
  105. _tileSet.TileSize = GameConfig.TileCellSizeVector2I;
  106. //物理层 0
  107. _tileSet.AddPhysicsLayer();
  108. _tileSet.SetPhysicsLayerCollisionLayer(0, PhysicsLayer.Wall);
  109. _tileSet.SetPhysicsLayerCollisionMask(0, PhysicsLayer.None);
  110. Debug.Log("GetPhysicsLayersCount: " + _tileSet.GetPhysicsLayersCount());
  111. //地形层 0
  112. _tileSet.AddTerrainSet();
  113. _tileSet.SetTerrainSetMode(0, TileSet.TerrainMode.CornersAndSides);
  114. _tileSet.AddTerrain(0);
  115. //Source资源
  116. foreach (var tileSetSourceInfo in _tileSetInfo.Sources)
  117. {
  118. var tileSetAtlasSource = new TileSetAtlasSource();
  119. _tileSet.AddSource(tileSetAtlasSource);
  120. //纹理
  121. var image = tileSetSourceInfo.GetSourceImage();
  122. tileSetAtlasSource.Texture = ImageTexture.CreateFromImage(image);
  123. var size = image.GetSize() / GameConfig.TileCellSize;
  124. //创建cell
  125. for (var i = 0; i < size.X; i++)
  126. {
  127. for (var j = 0; j < size.Y; j++)
  128. {
  129. tileSetAtlasSource.CreateTile(new Vector2I(i, j));
  130. }
  131. }
  132. var terrainInfo = tileSetSourceInfo.Terrain;
  133. //初始化地形
  134. tileSetAtlasSource.InitTerrain(terrainInfo, 0, 0);
  135. //ySort
  136. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 2), 23);
  137. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), 23);
  138. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), 23);
  139. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), 23);
  140. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), 23);
  141. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), 23);
  142. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), 23);
  143. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), 23);
  144.  
  145. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), 23);
  146. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), 23);
  147.  
  148. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), 23);
  149. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), 23);
  150. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), 23);
  151. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), 7);
  152. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), 7);
  153. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), 7);
  154. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), 7);
  155. //碰撞器
  156. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 0), true);
  157. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 0), true);
  158. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 0), true);
  159. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 0), true);
  160. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 0), false);
  161. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 0), true);
  162. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 0), true);
  163. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 0), false);
  164. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 0), true);
  165. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 0), false);
  166. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 0), true);
  167. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 0), true);
  168. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 1), false);
  169. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 1), false);
  170. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 1), false);
  171. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 1), false);
  172. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 1), false);
  173. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 1), false);
  174. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 1), false);
  175. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 1), false);
  176. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 1), false);
  177. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 1), false);
  178. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 1), false);
  179. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 2), false);
  180. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), false);
  181. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), false);
  182. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), false);
  183. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 2), false);
  184. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 2), false);
  185. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 2), false);
  186. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 2), false);
  187. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 2), false);
  188. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 2), false);
  189. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 2), false);
  190. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 2), false);
  191. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), true);
  192. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), true);
  193. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), true);
  194. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), true);
  195. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 3), false);
  196. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), false);
  197. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), false);
  198. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 3), false);
  199. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), false);
  200. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), false);
  201. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 3), false);
  202. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), false);
  203. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 4), false);
  204. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 4), false);
  205. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 4), false);
  206. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 4), false);
  207. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 4), false);
  208. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 4), false);
  209. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 4), false);
  210. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 4), false);
  211. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 4), false);
  212. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 4), false);
  213. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 4), false);
  214. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 4), false);
  215. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), false);
  216. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), false);
  217. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), false);
  218. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), false);
  219. }
  220. }
  221.  
  222. return _tileSet;
  223. }
  224.  
  225. /// <summary>
  226. /// 设置地图块的 Y 排序原点。
  227. /// </summary>
  228. private static void SetAtlasSourceYSortOrigin(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I bitCoords, int ySortOrigin)
  229. {
  230. var index = terrainInfo.TerrainCoordsToIndex(bitCoords, type);
  231. var cellData = terrainInfo.GetTerrainCell(index, type);
  232. if (cellData != null)
  233. {
  234. var pos = terrainInfo.GetPosition(cellData);
  235. var tileData = tileSetAtlasSource.GetTileData(pos, 0);
  236. tileData.YSortOrigin = ySortOrigin;
  237. }
  238. }
  239.  
  240. /// <summary>
  241. /// 设置Atlas源碰撞信息, isHalf: 是否半块
  242. /// </summary>
  243. private static void SetAtlasSourceCollision(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I bitCoords, bool isHalf)
  244. {
  245. var index = terrainInfo.TerrainCoordsToIndex(bitCoords, type);
  246. var cellData = terrainInfo.GetTerrainCell(index, type);
  247. if (cellData != null)
  248. {
  249. var pos = terrainInfo.GetPosition(cellData);
  250. var tileData = tileSetAtlasSource.GetTileData(pos, 0);
  251. tileData.AddCollisionPolygon(0);
  252. if (isHalf)
  253. {
  254. tileData.SetCollisionPolygonPoints(0, 0, new[]
  255. {
  256. new Vector2(-8, 0),
  257. new Vector2(8, 0),
  258. new Vector2(8, 8),
  259. new Vector2(-8, 8)
  260. });
  261. }
  262. else
  263. {
  264. tileData.SetCollisionPolygonPoints(0, 0, new []
  265. {
  266. new Vector2(-8, -8),
  267. new Vector2(8, -8),
  268. new Vector2(8, 8),
  269. new Vector2(-8, 8)
  270. });
  271. }
  272. }
  273. }
  274.  
  275. public void Destroy()
  276. {
  277. if (IsDestroyed) return;
  278. IsDestroyed = true;
  279. if (_tileSetInfo != null)
  280. {
  281. _tileSetInfo.Destroy();
  282. }
  283. if (_tileSet != null)
  284. {
  285. _tileSet.Dispose();
  286. }
  287. }
  288. }