Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / serialize / tileSet / TileSetSplit.cs
@小李xl 小李xl on 19 Feb 2024 15 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.  
  12. /// <summary>
  13. /// 路径
  14. /// </summary>
  15. [JsonInclude]
  16. public string Path;
  17.  
  18. /// <summary>
  19. /// 备注
  20. /// </summary>
  21. [JsonInclude]
  22. public string Remark;
  23.  
  24. /// <summary>
  25. /// 图块集路径
  26. /// </summary>
  27. [JsonIgnore]
  28. public string TileSetPath => Path + "/TileSet.json";
  29.  
  30. /// <summary>
  31. /// 图块集信息
  32. /// </summary>
  33. [JsonIgnore]
  34. public TileSetInfo TileSetInfo
  35. {
  36. get
  37. {
  38. if (_tileSetInfo == null && TileSetPath != null)
  39. {
  40. ReloadTileSetInfo();
  41. }
  42.  
  43. return _tileSetInfo;
  44. }
  45. }
  46.  
  47. private TileSetInfo _tileSetInfo;
  48. private TileSet _tileSet;
  49.  
  50. /// <summary>
  51. /// 设置图块集信息
  52. /// </summary>
  53. public void SetTileSetInfo(TileSetInfo info)
  54. {
  55. if (_tileSetInfo != null)
  56. {
  57. _tileSetInfo.Destroy();
  58. }
  59.  
  60. if (_tileSet != null)
  61. {
  62. _tileSet.Dispose();
  63. _tileSet = null;
  64. }
  65. _tileSetInfo = info;
  66. }
  67.  
  68. /// <summary>
  69. /// 重新加载图块集信息
  70. /// </summary>
  71. public void ReloadTileSetInfo()
  72. {
  73. var asText = ResourceManager.LoadText("res://" + TileSetPath);
  74. _tileSetInfo = JsonSerializer.Deserialize<TileSetInfo>(asText);
  75. if (_tileSet != null)
  76. {
  77. _tileSet.Dispose();
  78. _tileSet = null;
  79. }
  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. //检查是否有异常
  97. _tileSet = new TileSet();
  98. if (_tileSetInfo.Sources != null)
  99. {
  100. //TileSet网格大小
  101. _tileSet.TileSize = GameConfig.TileCellSizeVector2I;
  102. //物理层 0
  103. _tileSet.AddPhysicsLayer();
  104. _tileSet.SetPhysicsLayerCollisionLayer(0, PhysicsLayer.Wall);
  105. _tileSet.SetPhysicsLayerCollisionMask(0, PhysicsLayer.None);
  106.  
  107. var terrainSetIndex = 0;
  108. //Source资源
  109. for (var sourceIndex = 0; sourceIndex < _tileSetInfo.Sources.Count; sourceIndex++)
  110. {
  111. var tileSetSourceInfo = _tileSetInfo.Sources[sourceIndex];
  112. var terrainList = tileSetSourceInfo.Terrain;
  113. var tileSetAtlasSource = new TileSetAtlasSource();
  114. _tileSet.AddSource(tileSetAtlasSource);
  115. //纹理
  116. var image = tileSetSourceInfo.GetSourceImage();
  117. if (image != null)
  118. {
  119. tileSetAtlasSource.Texture = ImageTexture.CreateFromImage(image);
  120.  
  121. var size = image.GetSize() / GameConfig.TileCellSize;
  122. //创建cell
  123. for (var i = 0; i < size.X; i++)
  124. {
  125. for (var j = 0; j < size.Y; j++)
  126. {
  127. tileSetAtlasSource.CreateTile(new Vector2I(i, j));
  128. }
  129. }
  130. }
  131. for (var i = 0; i < terrainList.Count; i++)
  132. {
  133. var terrainInfo = terrainList[i];
  134. //地形层
  135. _tileSet.AddTerrainSet();
  136. _tileSet.AddTerrain(terrainSetIndex);
  137. //_tileSet.SetTerrainName(terrainSetIndex, 0, terrainInfo.Name);
  138. if (terrainInfo.TerrainType == 0) //3x3地形
  139. {
  140. _tileSet.SetTerrainSetMode(terrainSetIndex, TileSet.TerrainMode.CornersAndSides);
  141. }
  142. else //2x2地形
  143. {
  144. _tileSet.SetTerrainSetMode(terrainSetIndex, TileSet.TerrainMode.Corners);
  145. }
  146. //初始化地形
  147. tileSetAtlasSource.InitTerrain(terrainInfo, terrainSetIndex, 0);
  148. if (sourceIndex == 0 && i == 0)
  149. {
  150. InitMainSourceData(terrainInfo, tileSetAtlasSource);
  151. }
  152.  
  153. terrainSetIndex++;
  154. }
  155. }
  156. }
  157.  
  158. return _tileSet;
  159. }
  160.  
  161. private static void InitMainSourceData(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource)
  162. {
  163. //ySort
  164. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 2), 39);
  165. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), 39);
  166. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), 39);
  167. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), 39);
  168. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), 39);
  169. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), 39);
  170. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), 39);
  171. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), 39);
  172. //
  173. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), 39);
  174. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), 39);
  175. //
  176. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), 39);
  177. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), 39);
  178. // SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), 39);
  179.  
  180. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), 23);
  181. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), 23);
  182. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), 23);
  183. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), 23);
  184. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 1), 7);
  185. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 1), 7);
  186. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 1), 7);
  187. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 1), 7);
  188.  
  189. //碰撞器
  190. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 0), true);
  191. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 0), true);
  192. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 0), true);
  193. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 0), true);
  194. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 0), false);
  195. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 0), true);
  196. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 0), true);
  197. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 0), false);
  198. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 0), true);
  199. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 0), false);
  200. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 0), true);
  201. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 0), true);
  202.  
  203. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 1), false);
  204. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 1), false);
  205. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 1), false);
  206. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 1), false);
  207. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 1), false);
  208. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 1), false);
  209. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 1), false);
  210. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 1), false);
  211. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 1), false);
  212. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 1), false);
  213. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 1), false);
  214.  
  215. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 2), false);
  216. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), false);
  217. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), false);
  218. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), false);
  219. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 2), false);
  220. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 2), false);
  221. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 2), false);
  222. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 2), false);
  223. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 2), false);
  224. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 2), false);
  225. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 2), false);
  226. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 2), false);
  227.  
  228. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), true);
  229. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), true);
  230. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), true);
  231. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), true);
  232. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 3), false);
  233. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), false);
  234. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), false);
  235. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 3), false);
  236. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), false);
  237. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), false);
  238. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 3), false);
  239. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), false);
  240.  
  241. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 4), false);
  242. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 4), false);
  243. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 4), false);
  244. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 4), false);
  245. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 4), false);
  246. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 4), false);
  247. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 4), false);
  248. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 4), false);
  249. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 4), false);
  250. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 4), false);
  251. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 4), false);
  252. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 4), false);
  253.  
  254. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), false);
  255. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), false);
  256. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), false);
  257. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), false);
  258.  
  259. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 1), false);
  260. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 1), false);
  261. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 1), false);
  262. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 1), false);
  263. }
  264.  
  265. /// <summary>
  266. /// 设置地图块的 Y 排序原点。
  267. /// </summary>
  268. private static void SetAtlasSourceYSortOrigin(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I bitCoords, int ySortOrigin)
  269. {
  270. var index = terrainInfo.TerrainCoordsToIndex(bitCoords, type);
  271. var cellData = terrainInfo.GetTerrainCell(index, type);
  272. if (cellData != null)
  273. {
  274. var pos = terrainInfo.GetPosition(cellData);
  275. var tileData = tileSetAtlasSource.GetTileData(pos, 0);
  276. tileData.YSortOrigin = ySortOrigin;
  277. }
  278. }
  279.  
  280. /// <summary>
  281. /// 设置Atlas源碰撞信息, isHalf: 是否半块
  282. /// </summary>
  283. private static void SetAtlasSourceCollision(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I bitCoords, bool isHalf)
  284. {
  285. if (isHalf) //暂时让半块不设置碰撞信息
  286. {
  287. return;
  288. }
  289. var index = terrainInfo.TerrainCoordsToIndex(bitCoords, type);
  290. var cellData = terrainInfo.GetTerrainCell(index, type);
  291. if (cellData != null)
  292. {
  293. var pos = terrainInfo.GetPosition(cellData);
  294. var tileData = tileSetAtlasSource.GetTileData(pos, 0);
  295. tileData.AddCollisionPolygon(0);
  296. // if (isHalf)
  297. // {
  298. // tileData.SetCollisionPolygonPoints(0, 0, new[]
  299. // {
  300. // new Vector2(-8, 7),
  301. // new Vector2(8, 7),
  302. // new Vector2(8, 8),
  303. // new Vector2(-8, 8)
  304. // });
  305. // }
  306. // else
  307. {
  308. tileData.SetCollisionPolygonPoints(0, 0, new []
  309. {
  310. new Vector2(-8, -8),
  311. new Vector2(8, -8),
  312. new Vector2(8, 8),
  313. new Vector2(-8, 8)
  314. });
  315. }
  316. }
  317. }
  318.  
  319. public void Destroy()
  320. {
  321. if (IsDestroyed) return;
  322. IsDestroyed = true;
  323. if (_tileSetInfo != null)
  324. {
  325. _tileSetInfo.Destroy();
  326. }
  327. if (_tileSet != null)
  328. {
  329. _tileSet.Dispose();
  330. }
  331. }
  332. }