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; }
public void AddFrames(FrameList frameList) { foreach (var frame in frameList.Frames) { AddFrame(frame.FileName, frame.PositionInSheetX, frame.PositionInSheetY, frame.Width, frame.Height); } }