public static ushort[,] RenderMap(ROM game, Bitmap mapImage, Bitmap tileset, Bitmap attributeImage, Bitmap attributeBlocks, Map map) { FastPixel tp = new FastPixel(tileset); FastPixel mp = new FastPixel(mapImage); FastPixel ap = new FastPixel(attributeImage); FastPixel abp = new FastPixel(attributeBlocks); ushort[,] MapData = new ushort[map.Width, map.Height]; BinaryReader ReadROM = new BinaryReader(File.Open(game.FilePath, FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)); tp.rgbValues = new byte[tileset.Width * tileset.Height * 4]; mp.rgbValues = new byte[mapImage.Width * mapImage.Height * 4]; ap.rgbValues = new byte[attributeImage.Width * attributeImage.Height * 4]; abp.rgbValues = new byte[attributeBlocks.Width * attributeBlocks.Height * 4]; mp.Lock(); tp.Lock(); ap.Lock(); abp.Lock(); int TileSrcX, TileSrcY, AttSrcX, AttSrcY, DestX, DestY; ReadROM.BaseStream.Position = map.MapData - 0x8000000; for (int y = 0; y < map.Height; y++) { DestY = y * 16; for (int x = 0; x < map.Width; x++) { MapData[x, y] = ReadROM.ReadUInt16(); int Tile = MapData[x, y] & 0x3FF; int Attribute = MapData[x, y] >> 10; TileSrcX = (Tile % 8) * 16; TileSrcY = (Tile / 8) * 16; AttSrcX = (Attribute % 8) * 16; AttSrcY = (Attribute / 8) * 16; DestX = x * 16; for (int px = 0; px < 16; px++) { for (int py = 0; py < 16; py++) { mp.SetPixel(DestX + px, DestY + py, tp.GetPixel(TileSrcX + px, TileSrcY + py)); // Draw map ap.SetPixel(DestX + px, DestY + py, abp.GetPixel(AttSrcX + px, AttSrcY + py)); // Draw attribute map } } } } mp.Unlock(true); tp.Unlock(true); ap.Unlock(true); abp.Unlock(true); ReadROM.Close(); return(MapData); }
public static void RenderAttributes(Bitmap attributeImage, Bitmap attributeBlocks, Map map) { FastPixel ap = new FastPixel(attributeImage); FastPixel abp = new FastPixel(attributeBlocks); ap.rgbValues = new byte[attributeImage.Width * attributeImage.Height * 4]; abp.rgbValues = new byte[attributeBlocks.Width * attributeBlocks.Height * 4]; ap.Lock(); abp.Lock(); int SrcX, SrcY, DestX, DestY; for (int y = 0; y < map.Height; y++) { DestY = y * 16; for (int x = 0; x < map.Width; x++) { int Att = map.MapTileData[x, y] >> 10; SrcX = (Att % 8) * 16; SrcY = (Att / 8) * 16; DestX = x * 16; for (int px = 0; px < 16; px++) { for (int py = 0; py < 16; py++) { ap.SetPixel(DestX + px, DestY + py, abp.GetPixel(SrcX + px, SrcY + py)); } } } } ap.Unlock(true); abp.Unlock(true); }
public static void DrawTile8(FastPixel fpDrawer, byte[] gfxData, int tileindex, int x, int y, bool flipX, bool flipY, int palIndex, Color[] palette) { int mx = 0; int my = 0; if (flipX) { x += 7; } if (flipY) { y += 7; } int TileSeeker = tileindex * 64; if (TileSeeker + 64 > gfxData.Length) { return; } for (int i = 0; i < 64; i++) { if (gfxData[TileSeeker + i] > 0) { fpDrawer.SetPixel(x + (flipX ? -mx : mx), y + (flipY ? -my : my), palette[gfxData[TileSeeker + i] + (palIndex * 16)]); } mx++; if (mx == 8) { mx = 0; my++; } } }