private void ResetHeart(HeartShape heart, int minHeight, int maxHeight, int minWidth, int maxWidth)
 {
     heart.AnimationSpeed = AnimationSpeed;
     heart.Height         = CommonFunctions.RandomNext(minHeight, maxHeight);
     heart.Left           = CommonFunctions.RandomNext(0, (int)ActualWidth);
     heart.Width          = CommonFunctions.RandomNext(minWidth, maxWidth);
     heart.Top            = heart.Height * -1;
     heart.Start();
 }
        private HeartShape CreateHeart(int minHeight, int maxHeight, int minWidth, int maxWidth)
        {
            CommonFunctions.FixMinMax(ref minHeight, ref maxHeight);
            CommonFunctions.FixMinMax(ref minWidth, ref maxWidth);

            HeartShape newHeart = new HeartShape
            {
                Fill   = CommonFunctions.RandomGradientBrush <RadialGradientBrush>(),
                Stroke = CommonFunctions.RandomSolidColorBrush()
            };

            ResetHeart(newHeart, minHeight, maxHeight, minWidth, maxWidth);

            return(newHeart);
        }
        private void TimerTick(object sender, EventArgs e)
        {
            if (Parent != null)
            {
                double actualHeight = (double)Parent.GetValue(ActualHeightProperty);
                double actualWidth  = (double)Parent.GetValue(ActualWidthProperty);

                for (int i = Children.Count - 1; i >= 0; i--)
                {
                    HeartShape currentHeart = Children[i] as HeartShape;

                    if (currentHeart != null)
                    {
                        if (!currentHeart.IsReallyVisible(actualHeight, actualWidth))
                        {
                            currentHeart.Stop();

                            _Hearts.Enqueue(currentHeart);

                            Children.RemoveAt(i);
                            Settings.Instance.DecreaseHeartCount();
                        }
                    }
                }

                int currentCount = Settings.Instance.HeartCount;

                if (currentCount < Settings.Instance.MaximumHearts)
                {
                    int maxHearts = ((Settings.Instance.MaximumHearts - currentCount) / 10) + 1;

                    if (maxHearts == 1)
                    {
                        maxHearts = 2;
                    }

                    int minHeight = (int)(actualHeight * (Settings.Instance.Scale / 150.0));
                    int maxHeight = minHeight * 2;

                    int minWidth = (int)(actualWidth * (Settings.Instance.Scale / 150.0));
                    int maxWidth = minWidth * 2;

                    int heartsToCreate = CommonFunctions.RandomNext(1, maxHearts);

                    for (int i = 0; i < heartsToCreate; i++)
                    {
                        HeartShape newHeart;

                        if (_Hearts.Count > 0)
                        {
                            newHeart = _Hearts.Dequeue();
                            newHeart.Reset();
                            ResetHeart(newHeart, minHeight, maxHeight, minWidth, maxWidth);
                        }
                        else
                        {
                            newHeart = CreateHeart(minHeight, maxHeight, minWidth, maxWidth);
                        }

                        Children.Add(newHeart);
                        Settings.Instance.IncreaseHeartCount();
                    }
                }
            }
        }