private void S64_CheckedChanged(object sender, EventArgs e)
 {
     if (s64.Checked)
     {
         desc.Text = desc64;
         DynSize   = DynamicSize.DynamicSprite64x64;
     }
 }
 private void S48_CheckedChanged(object sender, EventArgs e)
 {
     if (s48.Checked)
     {
         desc.Text = desc48;
         DynSize   = DynamicSize.DynamicSprite48x48;
     }
 }
 private void S96_CheckedChanged(object sender, EventArgs e)
 {
     if (s96.Checked)
     {
         desc.Text = desc96;
         DynSize   = DynamicSize.DynamicSprite96x96;
     }
 }
 private void S80_CheckedChanged(object sender, EventArgs e)
 {
     if (s80.Checked)
     {
         desc.Text = desc80;
         DynSize   = DynamicSize.DynamicSprite80x80;
     }
 }
 private void S112_CheckedChanged(object sender, EventArgs e)
 {
     if (s112.Checked)
     {
         desc.Text = desc112;
         DynSize   = DynamicSize.DynamicSprite112x112;
     }
 }
 private void S16_CheckedChanged(object sender, EventArgs e)
 {
     if (s16.Checked)
     {
         desc.Text = desc16;
         DynSize   = DynamicSize.DynamicSprite16x16;
     }
 }
 private void S32_CheckedChanged(object sender, EventArgs e)
 {
     if (s32.Checked)
     {
         desc.Text = desc32;
         DynSize   = DynamicSize.DynamicSprite32x32;
     }
 }
Ejemplo n.º 8
0
        public static Frame FillGFX(Bitmap bp, int midx, int midy, PaletteId pid, ImageNode imn, DynamicSize DZ, Dictionary <Int32, byte> pal)
        {
            Frame f = new Frame()
            {
                Dynamic = true,
                DynSize = DZ,
                MidX    = midx,
                MidY    = midy
            };

            byte[,] gfx = new byte[128, f.DynSize.Height];

            ImageNode[] FollowsX = new ImageNode[imn.Length16];

            ImageNode imnaux = imn;
            ImageNode imnaux2;
            int       next = 0;

            /*
             * while(imnaux != null)
             * {
             *  imnaux2 = imnaux.Father;
             *  while (imnaux2 != null && imnaux.Size == 16)
             *  {
             *      if (imnaux2.Size == 16 && imnaux.Y == imnaux2.Y
             *          && Math.Abs(imnaux.X - imnaux2.X) <= 8)
             *      {
             *          if (imnaux.X < imnaux2.X)
             *          {
             *              FollowsX[next] = imnaux;
             *              FollowsX[next + 1] = imnaux2;
             *          }
             *          else
             *          {
             *              FollowsX[next] = imnaux2;
             *              FollowsX[next + 1] = imnaux;
             *          }
             *          next += 2;
             *      }
             *      imnaux2 = imnaux2.Father;
             *  }
             *  imnaux = imnaux.Father;
             * }*/

            ImageNode[] imns16 = new ImageNode[imn.Length16];
            ImageNode[] imns8  = new ImageNode[imn.Length8];

            imnaux = imn;
            int next16 = 0;
            int next8  = 0;

            while (imnaux != null)
            {
                if (imnaux.Size == 16)
                {
                    if (!FollowsX.Contains(imnaux))
                    {
                        imns16[next16] = imnaux;
                        next16++;
                    }
                }
                else
                {
                    imns8[next8] = imnaux;
                    next8++;
                }
                imnaux = imnaux.Father;
            }

            int w = (f.DynSize.Width / 8);
            int h = (f.DynSize.Height / 8);

            int[]     spaceUsed = new int[w * h];
            int       baseX     = 0;
            int       baseY     = 0;
            Color     c;
            int       bx, by;
            TileMask  tm;
            ImageNode imn1, imn2;

            for (int i = 0; i < FollowsX.Length; i += 2)
            {
                if (FollowsX[i] == null)
                {
                    break;
                }
                imn1 = FollowsX[i];
                imn2 = FollowsX[i + 1];
                if (FollowsX[i + 1].X < FollowsX[i].X)
                {
                    imn1 = FollowsX[i + 1];
                    imn2 = FollowsX[i];
                }
                bx = baseX / 8;
                by = baseY / 8;
                Buffer.BlockCopy(space24x16, 0, spaceUsed, (by / w + (bx % w)) * 4, 12);
                Buffer.BlockCopy(space24x16, 0, spaceUsed, ((by / w) + w + (bx % w)) * 4, 12);
                for (int x = 0; x < 16 && x + baseX < f.DynSize.Width; x++)
                {
                    for (int y = 0; y < 16 && y + baseY < f.DynSize.Height; y++)
                    {
                        c = bp.GetPixel(imn1.X + x, imn1.Y + y);
                        if (c.A == 255)
                        {
                            gfx[baseX + x, baseY + y] = pal[c.ToArgb()];
                        }
                    }
                }
                tm = new TileMask(TileSP.SP23, Tiles16[bx, by], 2, false, false)
                {
                    XDisp    = imn1.X * 2,
                    YDisp    = imn1.Y * 2,
                    Priority = Priority,
                    Palette  = pid
                };
                f.AddTile(tm);
                baseX += 8;
                for (int x = 0; x < 16 && imn1.X + x + 8 < bp.Width && x + baseX < f.DynSize.Width; x++)
                {
                    for (int y = 0; y < 16 && y + baseY < f.DynSize.Height; y++)
                    {
                        c = bp.GetPixel(imn1.X + x + 8, imn1.Y + y);
                        if (c.A == 255)
                        {
                            gfx[baseX + x, baseY + y] = pal[c.ToArgb()];
                        }
                    }
                }
                tm = new TileMask(TileSP.SP23, Tiles16[bx + 1, by], 2, false, false)
                {
                    XDisp    = (imn1.X + 8) * 2,
                    YDisp    = imn1.Y * 2,
                    Priority = Priority,
                    Palette  = pid
                };
                f.AddTile(tm);
                baseX += 16;
                if (baseX >= f.DynSize.Width)
                {
                    baseX  = 0;
                    baseY += 16;
                }
            }
            bool found = false;

            for (int i = 0; i < imns16.Length; i++)
            {
                if (imns16[i] == null)
                {
                    break;
                }
                found = false;
                for (int q = 0; q < h - 1; q++)
                {
                    for (int p = 0; p < w - 1; p++)
                    {
                        if (spaceUsed[q * w + p] == 0 &&
                            spaceUsed[q * w + p + 1] == 0 &&
                            spaceUsed[q * w + p + w] == 0 &&
                            spaceUsed[q * w + p + w + 1] == 0)
                        {
                            found = true;
                            baseX = p * 8;
                            baseY = q * 8;
                            spaceUsed[q * w + p]         = 1;
                            spaceUsed[q * w + p + 1]     = 1;
                            spaceUsed[q * w + p + w]     = 1;
                            spaceUsed[q * w + p + w + 1] = 1;
                            for (int x = 0; x < 16 && x + baseX < f.DynSize.Width && imns16[i].X + x < bp.Width; x++)
                            {
                                for (int y = 0; y < 16 && y + baseY < f.DynSize.Height && imns16[i].Y + y < bp.Height; y++)
                                {
                                    c = bp.GetPixel(imns16[i].X + x, imns16[i].Y + y);
                                    if (c.A == 255)
                                    {
                                        if (pal.ContainsKey(c.ToArgb()))
                                        {
                                            gfx[baseX + x, baseY + y] = pal[c.ToArgb()];
                                        }
                                        else
                                        {
                                            throw new KeyNotFoundException();
                                        }
                                    }
                                }
                            }
                            break;
                        }
                    }
                    if (found)
                    {
                        break;
                    }
                }
                if (!found)
                {
                    return(null);
                }
                else
                {
                    bx = baseX / 8;
                    by = baseY / 8;
                    tm = new TileMask(TileSP.SP23, Tiles16[bx, by], 2, false, false)
                    {
                        XDisp    = imns16[i].X * 2,
                        YDisp    = imns16[i].Y * 2,
                        Priority = Priority,
                        Palette  = pid
                    };
                    f.AddTile(tm);
                }
            }

            for (int i = 0; i < imns8.Length; i++)
            {
                if (imns8[i] == null)
                {
                    break;
                }
                found = false;
                for (int p = 0; p < h; p++)
                {
                    for (int q = 0; q < w; q++)
                    {
                        if (spaceUsed[p * w + q] == 0)
                        {
                            found = true;
                            baseX = q * 8;
                            baseY = p * 8;
                            spaceUsed[p * w + q] = 1;
                            for (int x = 0; x < 8 && x + baseX < f.DynSize.Width && imns8[i].X + x < bp.Width; x++)
                            {
                                for (int y = 0; y < 8 && y + baseY < f.DynSize.Height && imns8[i].Y + y < bp.Height; y++)
                                {
                                    c = bp.GetPixel(imns8[i].X + x, imns8[i].Y + y);
                                    if (c.A == 255)
                                    {
                                        gfx[baseX + x, baseY + y] = pal[c.ToArgb()];
                                    }
                                }
                            }
                            break;
                        }
                    }
                    if (found)
                    {
                        break;
                    }
                }
                if (!found)
                {
                    return(null);
                }
                else
                {
                    bx = baseX / 8;
                    by = baseY / 8;
                    tm = new TileMask(TileSP.SP23, Tiles8[bx, by], 2, false, false)
                    {
                        XDisp    = imns8[i].X * 2,
                        YDisp    = imns8[i].Y * 2,
                        Priority = Priority,
                        Palette  = pid
                    };
                    f.AddTile(tm);
                }
            }

            f.GFX = SnesGraphics.GetGFXFromColorMatrix(gfx);
            f.Sort(tilesorter);
            return(f);
        }
Ejemplo n.º 9
0
        public static List <Frame> FromSpriteSheetToFrames(Bitmap[] b, int midX, int midY, Dictionary <Int32, byte> Pal, string name, DynamicSize ds, PaletteId curId)
        {
            if (name == "" || name == null)
            {
                name = "Frame";
            }
            Frame        f;
            List <Frame> frames = new List <Frame>();

            for (int i = 0; i < b.Length; i++)
            {
                ImageNode imn = CropFrameInTiles(b[i]);
                f      = FillGFX(b[i], midX, midY, curId, imn, ds, Pal);
                f.Name = name + i;
                f.MidX = midX;
                f.MidY = midY;
                frames.Add(f);
            }

            return(frames);
        }