Newer
Older
DungeonShooting / DungeonShooting_Godot / src / game / data / ImportCombinationData.cs
  1.  
  2. using System.IO;
  3. using Godot;
  4.  
  5. /// <summary>
  6. /// 导入的组合图块数据
  7. /// </summary>
  8. public class ImportCombinationData
  9. {
  10. /// <summary>
  11. /// 预览图
  12. /// </summary>
  13. public ImageTexture PreviewTexture { get; set; }
  14. /// <summary>
  15. /// 组合图块数据
  16. /// </summary>
  17. public TileCombinationInfo CombinationInfo { get; set; }
  18.  
  19. private static Image MissingImage;
  20.  
  21. public ImportCombinationData(ImageTexture previewTexture, TileCombinationInfo combinationInfo)
  22. {
  23. PreviewTexture = previewTexture;
  24. CombinationInfo = combinationInfo;
  25. }
  26. /// <summary>
  27. /// 更新组合预览图
  28. /// </summary>
  29. public void UpdatePreviewTexture(Image src)
  30. {
  31. using (var image = GetPreviewTexture(src, CombinationInfo.Cells, CombinationInfo.Positions))
  32. {
  33. PreviewTexture.SetImage(image);
  34. }
  35. }
  36. /// <summary>
  37. /// 获取组合图块预览图数据
  38. /// </summary>
  39. /// <param name="src">地块纹理</param>
  40. /// <param name="cells">图块在地块中的位置</param>
  41. /// <param name="positions">图块位置</param>
  42. public static Image GetPreviewTexture(Image src, SerializeVector2[] cells, SerializeVector2[] positions)
  43. {
  44. var srcSize = src.GetSize();
  45. var rect = Utils.CalcTileRect(positions);
  46. var rectSize = rect.Size;
  47. var image = Image.Create(rectSize.X + 4, rectSize.Y + 4, false, Image.Format.Rgba8);
  48. for (var i = 0; i < cells.Length; i++)
  49. {
  50. var cell = cells[i].AsVector2I();
  51. var pos = positions[i].AsVector2I();
  52. //判断是否超出纹理范围
  53. if (cell.X + GameConfig.TileCellSize > srcSize.X || cell.Y + GameConfig.TileCellSize > srcSize.Y) //超出范围
  54. {
  55. if (MissingImage == null)
  56. {
  57. MissingImage = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Missing_png).GetImage();
  58. MissingImage.Convert(Image.Format.Rgba8);
  59. }
  60. image.BlendRect(MissingImage, new Rect2I(Vector2I.Zero, GameConfig.TileCellSizeVector2I), pos + new Vector2I(2, 2));
  61. }
  62. else
  63. {
  64. image.BlendRect(src, new Rect2I(cell, GameConfig.TileCellSizeVector2I), pos + new Vector2I(2, 2));
  65. }
  66. }
  67. return image;
  68. }
  69. }