public static void BuildTileIndex(string cachePattern) { TileGuide fullGuide = new TileGuide(); string search = Path.GetDirectoryName(String.Format(cachePattern, '*')); string pattern = Path.GetFileName(String.Format(cachePattern, '*')); try { foreach (string dir in Directory.GetFiles(search, pattern)) { string file = Path.GetFileNameWithoutExtension(dir); using (FileStream stream = File.OpenRead(dir)) { using (BinaryReader reader = new BinaryReader(stream)) { TileIndexNode guide = TileIndexNode.Load(reader); fullGuide.Nodes[file] = guide; } } } using (FileStream stream = new FileStream(search + "/index.idx", FileMode.Create, FileAccess.Write)) { using (BinaryWriter writer = new BinaryWriter(stream)) fullGuide.Save(writer); } } catch (Exception ex) { DiagManager.Instance.LogError(new Exception("Error importing index at " + search + "\n", ex)); } }
public static void SaveTileSheet(List <BaseSheet> tileList, string destFile, int tileSize) { int imgWidth = 0; int imgHeight = 0; foreach (BaseSheet sheet in tileList) { imgWidth = Math.Max(sheet.Width, imgWidth); } Dictionary <Loc, byte[]> tileData = new Dictionary <Loc, byte[]>(); foreach (BaseSheet sheet in tileList) { int count = (imgWidth / tileSize) * (sheet.Height / tileSize); // Write header information about each tile, skip blanks for (int ii = 0; ii < count; ii++) { int x = ii % (imgWidth / tileSize); int y = ii / (imgWidth / tileSize); //check if blank if (x >= sheet.Width / tileSize || sheet.IsBlank(x * tileSize, y * tileSize, tileSize, tileSize)) { //don't add } else { //cut off the corresponding piece using (BaseSheet tileTex = new BaseSheet(tileSize, tileSize)) { tileTex.Blit(sheet, x * tileSize, y * tileSize, tileSize, tileSize, 0, 0); //save as a PNG to a stream using (MemoryStream ms = new MemoryStream()) { using (BinaryWriter mw = new BinaryWriter(ms)) tileTex.Save(mw); byte[] bytes = ms.ToArray(); tileData.Add(new Loc(x, y + imgHeight / tileSize), bytes); } } } } imgHeight += sheet.Height; } //generate tileguide TileIndexNode tileGuide = new TileIndexNode(); tileGuide.TileSize = tileSize; Dictionary <Loc, long> spritePositions = new Dictionary <Loc, long>(); long currentPosition = 0; foreach (Loc key in tileData.Keys) { spritePositions[key] = currentPosition; currentPosition += tileData[key].LongLength; } foreach (Loc key in spritePositions.Keys) { tileGuide.Positions[key] = 0; } using (System.IO.FileStream spriteStream = new System.IO.FileStream(destFile, System.IO.FileMode.Create, System.IO.FileAccess.Write)) { using (BinaryWriter writer = new BinaryWriter(spriteStream)) { //save the guide tileGuide.Save(writer); //update how much space it takes foreach (Loc key in spritePositions.Keys) { tileGuide.Positions[key] = spritePositions[key] + writer.BaseStream.Position; } //save it again writer.Seek(0, SeekOrigin.Begin); tileGuide.Save(writer); //save data foreach (byte[] data in tileData.Values) { writer.Write(data); } } } }