예제 #1
0
        public SpriteSheet GetSpriteSheet(FrameGroupType groupType)
        {
            FrameGroup frameGroup = this.GetFrameGroup(groupType);

            if (frameGroup == null)
            {
                return(null);
            }

            Sprite[] sprites                = this.sprites[groupType];
            int      totalX                 = frameGroup.PatternZ * frameGroup.PatternX * frameGroup.Layers;
            int      totalY                 = frameGroup.Frames * frameGroup.PatternY;
            int      bitmapWidth            = (totalX * frameGroup.Width) * Sprite.DefaultSize;
            int      bitmapHeight           = (totalY * frameGroup.Height) * Sprite.DefaultSize;
            int      pixelsWidth            = frameGroup.Width * Sprite.DefaultSize;
            int      pixelsHeight           = frameGroup.Height * Sprite.DefaultSize;
            Bitmap   bitmap                 = new Bitmap(bitmapWidth, bitmapHeight, PixelFormat.Format32bppArgb);
            Dictionary <int, Rect> rectList = new Dictionary <int, Rect>();

            BitmapLocker lockBitmap = new BitmapLocker(bitmap);

            lockBitmap.LockBits();

            for (int f = 0; f < frameGroup.Frames; f++)
            {
                for (int z = 0; z < frameGroup.PatternZ; z++)
                {
                    for (int y = 0; y < frameGroup.PatternY; y++)
                    {
                        for (int x = 0; x < frameGroup.PatternX; x++)
                        {
                            for (int l = 0; l < frameGroup.Layers; l++)
                            {
                                int index = frameGroup.GetTextureIndex(l, x, y, z, f);
                                int fx    = (index % totalX) * pixelsWidth;
                                int fy    = (int)(Math.Floor((decimal)(index / totalX)) * pixelsHeight);
                                rectList.Add(index, new Rect(fx, fy, pixelsWidth, pixelsHeight));

                                for (int w = 0; w < frameGroup.Width; w++)
                                {
                                    for (int h = 0; h < frameGroup.Height; h++)
                                    {
                                        index = frameGroup.GetSpriteIndex(w, h, l, x, y, z, f);
                                        int px = (frameGroup.Width - w - 1) * Sprite.DefaultSize;
                                        int py = (frameGroup.Height - h - 1) * Sprite.DefaultSize;
                                        lockBitmap.CopyPixels(sprites[index].GetBitmap(), px + fx, py + fy);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            lockBitmap.UnlockBits();
            lockBitmap.Dispose();

            return(new SpriteSheet(bitmap, rectList));
        }
예제 #2
0
        public SpriteSheet GetSpriteSheet(ushort id, ThingCategory category, FrameGroupType groupType)
        {
            ThingType thing = this.Things.GetThing(id, category);

            if (thing == null)
            {
                return(null);
            }

            FrameGroup             group        = thing.GetFrameGroup(groupType);
            int                    totalX       = group.PatternZ * group.PatternX * group.Layers;
            int                    totalY       = group.Frames * group.PatternY;
            int                    bitmapWidth  = (totalX * group.Width) * Sprite.DefaultSize;
            int                    bitmapHeight = (totalY * group.Height) * Sprite.DefaultSize;
            int                    pixelsWidth  = group.Width * Sprite.DefaultSize;
            int                    pixelsHeight = group.Height * Sprite.DefaultSize;
            Bitmap                 bitmap       = new Bitmap(bitmapWidth, bitmapHeight, PixelFormat.Format32bppArgb);
            Dictionary <int, Rect> rectList     = new Dictionary <int, Rect>();

            BitmapLocker lockBitmap = new BitmapLocker(bitmap);

            lockBitmap.LockBits();

            for (int f = 0; f < group.Frames; f++)
            {
                for (int z = 0; z < group.PatternZ; z++)
                {
                    for (int y = 0; y < group.PatternY; y++)
                    {
                        for (int x = 0; x < group.PatternX; x++)
                        {
                            for (int l = 0; l < group.Layers; l++)
                            {
                                int index = group.GetTextureIndex(l, x, y, z, f);
                                int fx    = (index % totalX) * pixelsWidth;
                                int fy    = (int)(Math.Floor((decimal)(index / totalX)) * pixelsHeight);
                                rectList.Add(index, new Rect(fx, fy, pixelsWidth, pixelsHeight));

                                for (int w = 0; w < group.Width; w++)
                                {
                                    for (int h = 0; h < group.Height; h++)
                                    {
                                        index = group.GetSpriteIndex(w, h, l, x, y, z, f);
                                        int  px       = ((group.Width - w - 1) * Sprite.DefaultSize);
                                        int  py       = ((group.Height - h - 1) * Sprite.DefaultSize);
                                        uint spriteId = group.SpriteIDs[index];
                                        lockBitmap.CopyPixels(this.Sprites.GetSpriteBitmap(spriteId), px + fx, py + fy);
                                    }
                                }
                            }
                        }
                    }
                }
            }

            lockBitmap.UnlockBits();

            return(new SpriteSheet(bitmap, rectList));
        }