Ejemplo n.º 1
0
        public void UpdateSprites()
        {
            if (Sprite != null)
            {
                Sprite.X = X;
                Sprite.Y = Y;
            }

            Left?.UpdateSprites();
            Right?.UpdateSprites();
        }
Ejemplo n.º 2
0
        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,
            });
        }