public void UpdateSprites() { if (Sprite != null) { Sprite.X = X; Sprite.Y = Y; } Left?.UpdateSprites(); Right?.UpdateSprites(); }
private static PackSpritesReturnData OrganizeSprites(int width, int height, int maxSize, List <Sprite> sprites) { var perfectFit = sprites.FirstOrDefault( x => x.Width == maxSize && x.Height == maxSize); if (perfectFit != null) { perfectFit.X = 0; perfectFit.Y = 0; var unFitSprites = new List <Sprite>(sprites); unFitSprites.Remove(perfectFit); return(new PackSpritesReturnData { OrganizedSprites = new List <Sprite>() { perfectFit }, UnorganizedSprites = unFitSprites, Width = maxSize, Height = maxSize, }); } bool allOrganized = false; while (!allOrganized) { var spriteTree = new SpriteTree { Width = width, Height = height }; allOrganized = true; var unFitSprites = new List <Sprite>(); foreach (var sprite in sprites) { if (spriteTree.InsertSprite(sprite) == null) { allOrganized = false; unFitSprites.Add(sprite); } } if (allOrganized) { spriteTree.UpdateSprites(); } else { if (width < maxSize || height < maxSize) { if (height < width) { height *= 2; } else { width *= 2; } } else { spriteTree.UpdateSprites(); return(new PackSpritesReturnData { OrganizedSprites = sprites.Except(unFitSprites).ToList(), UnorganizedSprites = unFitSprites, Width = width, Height = height, }); } } } return(new PackSpritesReturnData { OrganizedSprites = sprites, UnorganizedSprites = new List <Sprite>(), Width = width, Height = height, }); }