示例#1
0
        public bool PackSpriteSheet(SpriteSheet originalSpriteSheet, bool requirePowTwo, bool requireSquare, int padding,
                                    bool generateMap, int maxWidth, int maxHeight, out SpriteSheet packed)
        {
            tempSpriteSheet = originalSpriteSheet.BlankClone();

            finalSpriteSheetWidth  = maxWidth;
            finalSpriteSheetHeight = maxHeight;

            this.requirePowTwo = requirePowTwo;
            this.requireSquare = requireSquare;

            this.padding = padding;


            var sprites = originalSpriteSheet.Frames;


            sprites.Sort(
                (i1, i2) =>
            {
                Size b1 = new Size(i1.Width, i1.Height);
                Size b2 = new Size(i2.Width, i2.Height);

                int c = -b1.Width.CompareTo(b2.Width);
                if (c != 0)
                {
                    return(c);
                }

                c = -b1.Height.CompareTo(b2.Height);
                if (c != 0)
                {
                    return(c);
                }

                return(0);
            }
                );

            if (!PackBruteForce(originalSpriteSheet.Frames))
            {
                packed = null;
                return(false);
            }


            Bitmap packedTexture = BuildPackedTexture(originalSpriteSheet);

            tempSpriteSheet.ResetTextureFromBitmap(packedTexture);

            if (generateMap)
            {
                int[] keys = new int[finalSpriteMapping.Keys.Count];
                finalSpriteMapping.Keys.CopyTo(keys, 0);
                foreach (var key in keys)
                {
                    Rect r = finalSpriteMapping[key];

                    r.Right  -= padding;
                    r.Bottom -= padding;

                    finalSpriteMapping[key] = r;
                }

                foreach (var map in finalSpriteMapping)
                {
                    SpriteSheetFrame newFrame = new SpriteSheetFrame(map.Value, tempSpriteSheet);
                    newFrame.Id      = map.Key;
                    newFrame.TagName = originalSpriteSheet.Frames[newFrame.Id].TagName;
                    tempSpriteSheet.Frames.Add(newFrame);
                }
            }


            packed = tempSpriteSheet;

            testSpriteMapping.Clear();
            finalSpriteMapping.Clear();

            return(true);
        }