예제 #1
0
        /// <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);
            }
        }
예제 #2
0
        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);
        }