Newer
Older
DungeonShooting / DungeonShooting_Godot / src / framework / map / serialize / tileSet / TileSetSplit.cs
@小李xl 小李xl on 21 Jan 2024 14 KB 创建地牢组时选择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.  
  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), 23);
  165. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), 23);
  166. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), 23);
  167. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), 23);
  168. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), 23);
  169. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), 23);
  170. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), 23);
  171. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), 23);
  172.  
  173. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), 23);
  174. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), 23);
  175.  
  176. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), 23);
  177. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), 23);
  178. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), 23);
  179.  
  180. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), 7);
  181. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), 7);
  182. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), 7);
  183. SetAtlasSourceYSortOrigin(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), 7);
  184.  
  185. //碰撞器
  186. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 0), true);
  187. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 0), true);
  188. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 0), true);
  189. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 0), true);
  190. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 0), false);
  191. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 0), true);
  192. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 0), true);
  193. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 0), false);
  194. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 0), true);
  195. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 0), false);
  196. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 0), true);
  197. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 0), true);
  198.  
  199. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 1), false);
  200. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 1), false);
  201. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 1), false);
  202. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 1), false);
  203. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 1), false);
  204. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 1), false);
  205. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 1), false);
  206. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 1), false);
  207. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 1), false);
  208. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 1), false);
  209. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 1), false);
  210.  
  211. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 2), false);
  212. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 2), false);
  213. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 2), false);
  214. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 2), false);
  215. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 2), false);
  216. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 2), false);
  217. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 2), false);
  218. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 2), false);
  219. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 2), false);
  220. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 2), false);
  221. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 2), false);
  222. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 2), false);
  223.  
  224. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 3), true);
  225. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 3), true);
  226. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 3), true);
  227. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 3), true);
  228. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 3), false);
  229. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 3), false);
  230. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 3), false);
  231. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 3), false);
  232. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 3), false);
  233. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 3), false);
  234. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 3), false);
  235. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 3), false);
  236.  
  237. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(0, 4), false);
  238. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(1, 4), false);
  239. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(2, 4), false);
  240. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(3, 4), false);
  241. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(4, 4), false);
  242. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(5, 4), false);
  243. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(6, 4), false);
  244. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(7, 4), false);
  245. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(8, 4), false);
  246. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(9, 4), false);
  247. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(10, 4), false);
  248. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 1, new Vector2I(11, 4), false);
  249.  
  250. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(0, 0), false);
  251. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(1, 0), false);
  252. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(2, 0), false);
  253. SetAtlasSourceCollision(terrainInfo, tileSetAtlasSource, 2, new Vector2I(3, 0), false);
  254. }
  255.  
  256. /// <summary>
  257. /// 设置地图块的 Y 排序原点。
  258. /// </summary>
  259. private static void SetAtlasSourceYSortOrigin(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I bitCoords, int ySortOrigin)
  260. {
  261. var index = terrainInfo.TerrainCoordsToIndex(bitCoords, type);
  262. var cellData = terrainInfo.GetTerrainCell(index, type);
  263. if (cellData != null)
  264. {
  265. var pos = terrainInfo.GetPosition(cellData);
  266. var tileData = tileSetAtlasSource.GetTileData(pos, 0);
  267. tileData.YSortOrigin = ySortOrigin;
  268. }
  269. }
  270.  
  271. /// <summary>
  272. /// 设置Atlas源碰撞信息, isHalf: 是否半块
  273. /// </summary>
  274. private static void SetAtlasSourceCollision(TileSetTerrainInfo terrainInfo, TileSetAtlasSource tileSetAtlasSource, byte type, Vector2I bitCoords, bool isHalf)
  275. {
  276. var index = terrainInfo.TerrainCoordsToIndex(bitCoords, type);
  277. var cellData = terrainInfo.GetTerrainCell(index, type);
  278. if (cellData != null)
  279. {
  280. var pos = terrainInfo.GetPosition(cellData);
  281. var tileData = tileSetAtlasSource.GetTileData(pos, 0);
  282. tileData.AddCollisionPolygon(0);
  283. if (isHalf)
  284. {
  285. tileData.SetCollisionPolygonPoints(0, 0, new[]
  286. {
  287. new Vector2(-8, 0),
  288. new Vector2(8, 0),
  289. new Vector2(8, 8),
  290. new Vector2(-8, 8)
  291. });
  292. }
  293. else
  294. {
  295. tileData.SetCollisionPolygonPoints(0, 0, new []
  296. {
  297. new Vector2(-8, -8),
  298. new Vector2(8, -8),
  299. new Vector2(8, 8),
  300. new Vector2(-8, 8)
  301. });
  302. }
  303. }
  304. }
  305.  
  306. public void Destroy()
  307. {
  308. if (IsDestroyed) return;
  309. IsDestroyed = true;
  310. if (_tileSetInfo != null)
  311. {
  312. _tileSetInfo.Destroy();
  313. }
  314. if (_tileSet != null)
  315. {
  316. _tileSet.Dispose();
  317. }
  318. }
  319. }