public FrameList Load(string folder)
        {
            var files = Directory.GetFiles(folder).Where(file => file.EndsWith(".png")).ToList();
            files.Sort();

            var frameList = new FrameList();
            foreach (var file in files) {
                frameList.AddFrame(file);
            }

            frameList.Name = new DirectoryInfo(folder).Name;
            return frameList;
        }
        public SpriteSheet Combine(FrameList frameList)
        {
            // http://codeincomplete.com/posts/2011/5/7/bin_packing/
            // http://jwezorek.com/2013/01/sprite-packing-in-python/
            // http://www.blackpawn.com/texts/lightmaps/default.html

            var sortedList = frameList.Frames.OrderByDescending(f => f.Height*f.Width);

            _root = new Node() { Width = sortedList.First().Width, Height = sortedList.First().Height };

            foreach (var frame in sortedList){
                var node = FindNode(_root, frame.Width, frame.Height);
                if (node != null){
                    var fit = SplitNode(node, frame.Width, frame.Height);
                    frame.PositionInSheetX = fit.X;
                    frame.PositionInSheetY = fit.Y;
                }
                else{
                    var fit = GrowNode(frame.Width, frame.Height);
                    frame.PositionInSheetX = fit.X;
                    frame.PositionInSheetY = fit.Y;
                }
            }

            var finalImage = new Bitmap(_root.Width, _root.Height);

            using (var g = Graphics.FromImage(finalImage)) {
                //set background color
                g.Clear(Color.Transparent);

                foreach (var frame in frameList.Frames) {
                    g.DrawImage(frame.Bitmap, new Rectangle(frame.PositionInSheetX, frame.PositionInSheetY, frame.Width, frame.Height));
                }
            }

            return new SpriteSheet(frameList, finalImage, frameList.Name);
        }
        public SpriteSheet Combine(FrameList frameList)
        {
            Bitmap finalImage = null;
            try {
                var width = 0;
                var height = 0;

                foreach (var frame in frameList.Frames) {
                    //update the size of the final bitmap
                    width += frame.Width;
                    height = frame.Height > height ? frame.Height : height;
                }

                finalImage = new Bitmap(width, height);

                using (var g = Graphics.FromImage(finalImage)) {
                    //set background color
                    g.Clear(Color.Transparent);

                    //go through each image and draw it on the final image
                    var offsetX = 0;
                    const int offsetY = 0;
                    foreach (var frame in frameList.Frames) {
                        frame.PositionInSheetX = offsetX;
                        frame.PositionInSheetY = offsetY;
                        g.DrawImage(frame.Bitmap, new Rectangle(offsetX, offsetY, frame.Width, frame.Height));
                        offsetX += frame.Width;
                    }
                }
            } catch (Exception) {
                if (finalImage != null)
                    finalImage.Dispose();
                throw;
            }

            return new SpriteSheet(frameList, finalImage, frameList.Name);
        }
 public SpriteSheet(FrameList frameList, Bitmap image, string name)
 {
     FrameList = frameList;
     Image = image;
     Name = name;
 }
Exemple #5
0
 public void AddFrames(FrameList frameList)
 {
     foreach (var frame in frameList.Frames) {
         AddFrame(frame.FileName, frame.PositionInSheetX, frame.PositionInSheetY, frame.Width, frame.Height);
     }
 }