/// <summary> /// arrange the array of tiles into a single bitmap /// </summary> public static Bitmap FromBitmaps(Bitmap[] bitmaps, COLFile collisionInfo) { // 20x50 makes most sense for maps with 1000 tiles int num = bitmaps.Length; int w = 20; int h = (num / w) + 1; Bitmap bmp = new Bitmap(16 * w, 16 * h); using (var gfx = Graphics.FromImage(bmp)) { for (int i = 0; i < num; i++) { int x = i % w; int y = i / w; gfx.DrawImage(bitmaps[i], 16 * x, 16 * y, 16, 16); if (collisionInfo != null) { CollisionDrawer.Draw(gfx, collisionInfo, i, x, y); } } } return(bmp); }
private void make(object sender, DoWorkEventArgs e) { try { worker.ReportProgress(0); Map = new PCMFile(mapEntry.Data); COLFile colFile = new COLFile(collisionsEntry.Data); EIBFile entitiesFile = entitiesEntry != null ? new EIBFile(entitiesEntry.Data) : null; worker.ReportProgress(10); if (worker.CancellationPending) { return; } // get tileset bitmaps Bitmap[] tiles = PICConverter.PICToBitmaps(tilesetEntry.Data, paletteEntry.Data); worker.ReportProgress(40); if (worker.CancellationPending) { return; } TilesBitmap = new Bitmap(Game.TileSize * Map.Width, Game.TileSize * Map.Height); CollisionsBitmap = new Bitmap(Game.TileSize * Map.Width, Game.TileSize * Map.Height); EntitiesBitmap = new Bitmap(Game.TileSize * Map.Width, Game.TileSize * Map.Height); GridBitmap = new Bitmap(Game.TileSize * Map.Width, Game.TileSize * Map.Height); // draw map tiles and collisions Graphics tilesGfx = Graphics.FromImage(TilesBitmap); Graphics collGfx = Graphics.FromImage(CollisionsBitmap); int total = Map.Width * Map.Height; for (int y = 0; y < Map.Height; y++) { for (int x = 0; x < Map.Width; x++) { int id = x + y * Map.Width; int tileId = Map.TilesIndices[y, x]; // draw cell Bitmap tile = tiles[tileId]; tilesGfx.DrawImage(tile, x * Game.TileSize, y * Game.TileSize, Game.TileSize, Game.TileSize); CollisionDrawer.Draw(collGfx, colFile, tileId, x, y); worker.ReportProgress(40 + (int)Math.Round(50f * id / total)); if (worker.CancellationPending) { Error = "Cancelled"; goto end; } } } // draw entity info if (entitiesFile != null) { EntityDrawer.Draw(EntitiesBitmap, entitiesFile); } // draw grid Graphics gridGfx = Graphics.FromImage(GridBitmap); Pen pen = new Pen(Color.FromArgb(100, 200, 200, 0), 1); for (int x = 0; x < Map.Width; x++) { gridGfx.DrawLine(pen, x * Game.TileSize, 0, x * Game.TileSize, Map.Height * Game.TileSize); } for (int y = 0; y < Map.Height; y++) { gridGfx.DrawLine(pen, 0, y * Game.TileSize, Map.Width * Game.TileSize, y * Game.TileSize); } gridGfx.Dispose(); end: tilesGfx.Dispose(); collGfx.Dispose(); } catch (Exception ex) { Error = ex.Message; return; } }