public void Update(GameTime gameTime)
        {
            var asteroids = _components.GetAllOfType <Asteroid>();

            foreach (var asteroid in asteroids)
            {
                if (asteroid.Destroyed)
                {
                    if (asteroid.Size == 5)
                    {
                        _components.Add(new Asteroid(asteroid.Texture, Asteroid.AsteroidSize.Medium, asteroid.Position));
                        _components.Add(new Asteroid(asteroid.Texture, Asteroid.AsteroidSize.Medium, asteroid.Position));
                        _components.Add(new Asteroid(asteroid.Texture, Asteroid.AsteroidSize.Medium, asteroid.Position));
                    }
                    else if (asteroid.Size == 3)
                    {
                        _components.Add(new Asteroid(asteroid.Texture, Asteroid.AsteroidSize.Small, asteroid.Position));
                        _components.Add(new Asteroid(asteroid.Texture, Asteroid.AsteroidSize.Small, asteroid.Position));
                        _components.Add(new Asteroid(asteroid.Texture, Asteroid.AsteroidSize.Small, asteroid.Position));
                    }

                    _components.Remove <Asteroid>(asteroid);
                }
            }
        }
        public void Update(GameTime gameTime)
        {
            var movableComponents = _components.GetAllOfType <IMovableComponent>();

            foreach (var component in movableComponents)
            {
                component.Move(gameTime);
            }
        }
        public void Update(GameTime gameTime)
        {
            List <ICollidableComponent> collidableComponents = _components.GetAllOfType <ICollidableComponent>();

            for (int i = 0; i < collidableComponents.Count; i++)
            {
                for (int j = i + 1; j < collidableComponents.Count; j++)
                {
                    if (collidableComponents[i] != null && collidableComponents[j] != null && collidableComponents[i].CollisionBoundaries.Intersects(collidableComponents[j].CollisionBoundaries))
                    {
                        collidableComponents[i].CollidedWith(collidableComponents[j]);
                        collidableComponents[j].CollidedWith(collidableComponents[i]);

                        if (collidableComponents[i] is Asteroid && collidableComponents[j] is Asteroid)
                        {
                            var a1 = collidableComponents[i] as Asteroid;
                            var a2 = collidableComponents[j] as Asteroid;

                            if (a1.Bounced || a2.Bounced)
                            {
                                continue;
                            }

                            var normala1 = a1.Position - a2.Position;
                            var normala2 = a2.Position - a1.Position;

                            normala1.Normalize();
                            normala2.Normalize();

                            Vector2 CMVelocity = Vector2.Divide(Vector2.Multiply(a1.Velocity, (float)a1.Mass) + Vector2.Multiply(a2.Velocity, (float)a2.Mass), (float)(a1.Mass + a2.Mass));

                            a1.Direction -= CMVelocity;
                            a1.Direction  = Vector2.Reflect(a1.Direction, normala1);
                            a1.Direction += CMVelocity;

                            a2.Direction -= CMVelocity;
                            a2.Direction  = Vector2.Reflect(a2.Direction, normala2);
                            a2.Direction += CMVelocity;

                            a1.Bounced = true;
                            a2.Bounced = true;
                        }
                    }
                }
            }
        }