using System.IO; using Godot; /// <summary> /// 导入的组合图块数据 /// </summary> public class ImportCombinationData { /// <summary> /// 预览图 /// </summary> public ImageTexture PreviewTexture { get; set; } /// <summary> /// 组合图块数据 /// </summary> public TileCombinationInfo CombinationInfo { get; set; } private static Image MissingImage; public ImportCombinationData(ImageTexture previewTexture, TileCombinationInfo combinationInfo) { PreviewTexture = previewTexture; CombinationInfo = combinationInfo; } /// <summary> /// 更新组合预览图 /// </summary> public void UpdatePreviewTexture(Image src) { using (var image = GetPreviewTexture(src, CombinationInfo.Cells, CombinationInfo.Positions)) { PreviewTexture.SetImage(image); } } /// <summary> /// 获取组合图块预览图数据 /// </summary> /// <param name="src">地块纹理</param> /// <param name="cells">图块在地块中的位置</param> /// <param name="positions">图块位置</param> public static Image GetPreviewTexture(Image src, SerializeVector2[] cells, SerializeVector2[] positions) { var srcSize = src.GetSize(); var rect = Utils.CalcTileRect(positions); var rectSize = rect.Size; var image = Image.Create(rectSize.X + 4, rectSize.Y + 4, false, Image.Format.Rgba8); for (var i = 0; i < cells.Length; i++) { var cell = cells[i].AsVector2I(); var pos = positions[i].AsVector2I(); //判断是否超出纹理范围 if (cell.X + GameConfig.TileCellSize > srcSize.X || cell.Y + GameConfig.TileCellSize > srcSize.Y) //超出范围 { if (MissingImage == null) { MissingImage = ResourceManager.LoadTexture2D(ResourcePath.resource_sprite_ui_commonIcon_Missing_png).GetImage(); MissingImage.Convert(Image.Format.Rgba8); } image.BlendRect(MissingImage, new Rect2I(Vector2I.Zero, GameConfig.TileCellSizeVector2I), pos + new Vector2I(2, 2)); } else { image.BlendRect(src, new Rect2I(cell, GameConfig.TileCellSizeVector2I), pos + new Vector2I(2, 2)); } } return image; } }