Exemplo n.º 1
0
        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));
            }
        }
Exemplo n.º 2
0
        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);
                    }
                }
            }
        }