/// <summary> /// Creates an affine/transformed sprite from a block of OAM data and the affine data with it /// </summary> public Sprite(Palette palette, Tileset tileset, OAM oam, OAM_Affine transform) { Size size = oam.GetDimensions(); Load(palette, tileset, new TileMap(oam.GetTileMap(size)), false, false); int width = (oam.OBJMode == OAM_OBJMode.BigAffine) ? size.Width * 16 : size.Width * 8; int height = (oam.OBJMode == OAM_OBJMode.BigAffine) ? size.Height * 16: size.Height * 8; byte[] data = new byte[width * height]; int tileX, tileY; int affX, affY; int halfW = width / 2; int halfH = height / 2; for (int y = halfH * -1; y < halfH; y++) { for (int x = halfW * -1; x < halfW; x++) { affX = (int)(transform.Ux * x + transform.Vx * y) + size.Width * 4; affY = (int)(transform.Uy * x + transform.Vy * y) + size.Height * 4; if (affX < 0 || affX >= size.Width * 8) { continue; } if (affY < 0 || affY >= size.Height * 8) { continue; } tileX = affX / Tile.SIZE; tileY = affY / Tile.SIZE; int index = Tiles[tileX, tileY]; if (index < 0 || index >= Sheet.Count) { continue; } tileX = affX % Tile.SIZE; tileY = affY % Tile.SIZE; data[(halfW + x) + (halfH + y) * width] = (byte)Sheet[index][tileX, tileY]; } } Transform = new Bitmap(width, height, palette.ToBytes(false), data); }
/// <summary> /// Creates a sprite from a block of OAM data /// </summary> public Sprite(Palette palette, Tileset tileset, OAM oam) { Load(palette, tileset, new TileMap(oam.GetTileMap(oam.GetDimensions())), oam.FlipH, oam.FlipV); }