/// <summary> /// Adds a compound sprite made from an OAM array onto the spritesheet /// </summary> public void AddSprite(Palette palette, Tileset tileset, OAM_Array oam, int offsetX, int offsetY, bool showAffines = true) { Sprite sprite; for (int i = 0; i < oam.Sprites.Count; i++) { if (oam[i].IsAffineSprite()) { if (!showAffines) { continue; } sprite = new Sprite(palette, tileset, oam[i], oam.Affines[oam[i].AffineIndex]); } else { sprite = new Sprite(palette, tileset, oam[i]); } this.AddSprite(sprite, offsetX + oam[i].ScreenX, offsetY + oam[i].ScreenY); } }
public OAM_Maker(ref List <TileSheet> Graphics, GBA.Image image, int offsetX, int offsetY) { Rectangle sprite = GetSpriteArea(image); if (sprite == new Rectangle()) { TilesetIndex = 0; SpriteData = new OAM_Array(); return; } var OAMs = GetSpriteOAMs(image, sprite); TilesetIndex = -1; Point[] sheet = new Point[OAMs.Count]; for (int i = 0; i < Graphics.Count; i++) { sheet = Graphics[i].CheckIfFits(OAMs); if (sheet == null) { continue; } else { TilesetIndex = i; break; } } if (TilesetIndex == -1) { TilesetIndex = Graphics.Count; Graphics.Add(new TileSheet(32, 8)); sheet = Graphics[TilesetIndex].CheckIfFits(OAMs); if (sheet == null) { throw new Exception("Frame has more tiles than a 32x8 TileSheet allows."); } } List <OAM> result = new List <OAM>(); Point pos; Size size; for (int i = 0; i < OAMs.Count; i++) { pos = OAMs[i].Item1; size = OAMs[i].Item2; for (int y = 0; y < size.Height; y++) { for (int x = 0; x < size.Width; x++) { Graphics[TilesetIndex][sheet[i].X + x, sheet[i].Y + y] = image.GetTile( pos.X + x * Tile.SIZE, pos.Y + y * Tile.SIZE); } } var shapesize = OAM.GetShapeSize(size); if (shapesize == null) { throw new Exception("Invalid OAM Shape/Size created."); } if (result.Count == MAXIMUM) { throw new Exception("There cannot be more than " + MAXIMUM + " OAM objects in one frame."); } result.Add(new OAM( shapesize.Item1, shapesize.Item2, (Int16)(pos.X - offsetX), (Int16)(pos.Y - offsetY), 0x00, 0x00, OAM_GFXMode.Normal, OAM_OBJMode.Normal, false, false, (byte)sheet[i].X, (byte)sheet[i].Y, false, false)); /* * EmblemMagic.Program.ShowMessage( * "h: " + size.Width + ", w: " + size.Height + * '\n' + "shape: " + shapesize.Item1 + ", size: " + shapesize.Item2 + * '\n' + result[result.Count - 1].SpriteShape + ", " + result[result.Count - 1].SpriteSize + * '\n' + EmblemMagic.Util.BytesToSpacedHex(result[result.Count - 1].ToBytes())); */ } SpriteData = new OAM_Array(result); }