public static Texture GetTile(int sheetNum, Maps.Loc2D tileLoc) { try { if (tileData[sheetNum] == null) { tileData[sheetNum] = new TileMetadata(); tileData[sheetNum].Load(Paths.CachedGFXPath + "Tile\\Tiles" + sheetNum + ".tile"); } int tileNum = (tileData[sheetNum].Size.Width / TILE_SIZE) * tileLoc.Y + tileLoc.X; Texture cacheSheet = tileCache.Get(sheetNum + "-" + tileLoc.X + "-" + tileLoc.Y); if (cacheSheet != null) return cacheSheet; if (sheetNum > -1 && sheetNum < TOTAL_TILE_SHEETS && tileNum > -1 && tileNum < tileData[sheetNum].TotalTiles) { Texture sheet = new Texture(); byte[] tileBytes = new byte[tileData[sheetNum].TileSizes[tileNum]]; using (FileStream stream = new FileStream(Paths.CachedGFXPath + "Tile\\Tiles" + sheetNum + ".tile", FileMode.Open, FileAccess.Read, FileShare.Read)) { // Seek to the location of the tile stream.Seek(tileData[sheetNum].GetTilePosition(tileNum), SeekOrigin.Begin); stream.Read(tileBytes, 0, tileBytes.Length); } using (MemoryStream tileStream = new MemoryStream(tileBytes)) { sheet.LoadPixelsFromBytes(tileStream); sheet.LoadTextureFromPixels32(); } tileCache.Add(sheetNum + "-" + tileLoc.X + "-" + tileLoc.Y, sheet); return sheet; } } catch (Exception ex) { Logs.Logger.LogError(new Exception("Error retrieving tile " + tileLoc.X + ", " + tileLoc.Y + " from Tileset #" + sheetNum + "\n", ex)); } tileCache.Add(sheetNum + "-" + tileLoc.X + "-" + tileLoc.Y, ErrorTexture); return ErrorTexture; }
public static void Init() { //run conversions if (!Directory.Exists(Paths.CachedGFXPath)) Directory.CreateDirectory(Paths.CachedGFXPath); Conversion.CompileAllSprites(Paths.SpritesPath, Paths.CachedGFXPath + "Sprite"); Conversion.CompileAllTiles(Paths.TilesPath, Paths.CachedGFXPath + "Tile"); Conversion.CompileAllPortraits(Paths.PortraitsPath, Paths.CachedGFXPath + "Portrait"); Game.UpdateLoadMsg("Loading Base Textures"); //load error texture ErrorTexture = new AnimSheet(); ErrorTexture.LoadPixelsFromFile32(Paths.BaseGFXPath+"Error.png"); //load blank texture BlankTexture = new Texture(); BlankTexture.LoadPixelsFromFile32(Paths.BaseGFXPath + "UI\\Blank.png"); //load menu data MenuBack = new TileSheet(); MenuBack.LoadPixelsFromFile32(Paths.BaseGFXPath + "UI\\Back.png"); Picker = new TileSheet(); Picker.LoadPixelsFromFile32(Paths.BaseGFXPath + "UI\\Picker.png"); Game.UpdateLoadMsg("Loading Caches"); //initialize caches spriteCache = new MultiNameLRUCache<string, SpriteSheet>(SPRITE_CACHE_SIZE); spriteCache.OnItemRemoved = DisposeCachedObject; mugshotCache = new MultiNameLRUCache<string, TileSheet>(MUGSHOT_CACHE_SIZE); mugshotCache.OnItemRemoved = DisposeCachedObject; spellCache = new LRUCache<string, AnimSheet>(SPELL_CACHE_SIZE); spellCache.OnItemRemoved = DisposeCachedObject; statusCache = new LRUCache<int, AnimSheet>(STATUS_CACHE_SIZE); statusCache.OnItemRemoved = DisposeCachedObject; itemCache = new LRUCache<int, AnimSheet>(ITEM_CACHE_SIZE); itemCache.OnItemRemoved = DisposeCachedObject; objectCache = new LRUCache<int, AnimSheet>(OBJECT_CACHE_SIZE); objectCache.OnItemRemoved = DisposeCachedObject; tileCache = new LRUCache<string, Texture>(TILE_CACHE_SIZE); tileCache.OnItemRemoved = DisposeCachedObject; //load metadata tileData = new TileMetadata[TOTAL_TILE_SHEETS]; }
static void SaveTileMap(Bitmap bitmap, string destinationPath) { BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); // File format: // [tileset-width(4)][tileset-height(4)][tile-count(4)] // [tileposition-1(4)][tilesize-1(4)][tileposition-2(4)][tilesize-2(4)][tileposition-n(n*4)][tilesize-n(n*4)] // [tile-1(variable)][tile-2(variable)][tile-n(variable)] using (System.IO.FileStream spriteStream = new System.IO.FileStream(destinationPath, System.IO.FileMode.Create, System.IO.FileAccess.Write)) { using (BinaryWriter writer = new BinaryWriter(spriteStream)) { // Write tileset width writer.Write(bitmap.Width); // Write tileset height writer.Write(bitmap.Height); int count = (bitmap.Width / TextureManager.TILE_SIZE) * (bitmap.Height / TextureManager.TILE_SIZE); long tileDataPosition = 0; // Write header information about each tile List<byte[]> tiles = new List<byte[]>(); for (int i = 0; i < count; i++) { //cut off the corresponding piece using (Texture tileTex = new Texture()) { tileTex.CreatePixels32(TextureManager.TILE_SIZE, TextureManager.TILE_SIZE); int x = i % (bitmap.Width / TextureManager.TILE_SIZE); int y = i / (bitmap.Width / TextureManager.TILE_SIZE); tileTex.Blit(data, x * TextureManager.TILE_SIZE, y * TextureManager.TILE_SIZE, TextureManager.TILE_SIZE, TextureManager.TILE_SIZE, 0, 0); //save as a PNG to a stream using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { tileTex.Save(ms, System.Drawing.Imaging.ImageFormat.Png); byte[] bytes = ms.ToArray(); tiles.Add(bytes); // Write the position of the tile writer.Write(tileDataPosition); // Write the size of the tile writer.Write(bytes.Length); // Add the tile size to the position tileDataPosition += bytes.Length; } } } // Now that all header is written, write tile data for (int i = 0; i < count; i++) { writer.Write(tiles[i], 0, tiles[i].Length); } } } }