private CollisionStructure CalculateCollisionDirection(IDynamicObject dynamic1, IDynamicObject dynamic2)
        {
            CollisionStructure collisionStruct = new CollisionStructure();

            bool      collisionHappened = false;
            Rectangle dynamicOneOldCollisionRectangle = CalculateOldCollisionRectangle(dynamic1);

            if (dynamic1.Velocity.Y > 0) // dynamic1 is moving down
            {
                // Top of d2 is farther down than bottom of old d1
                if (dynamic2.CollisionRectangle.Top >= dynamicOneOldCollisionRectangle.Bottom)
                {
                    // dynamic1 on top of dynamic2 : dynamic2 on bottom of dynamic1
                    collisionStruct.firstObjectCollisionDirection  = GameValues.CollisionDirectionBottom;
                    collisionStruct.secondObjectCollisionDirection = GameValues.CollisionDirectionTop;
                    collisionHappened = true;
                }
            }
            else if (dynamic1.Velocity.Y < 0) // dynamic1 is moving up
            {
                // Bottom of d2 is higher up than top of old d1
                if (dynamic2.CollisionRectangle.Bottom <= dynamicOneOldCollisionRectangle.Top)
                {
                    // dynamic1 on bottom of dynamic2 : dynamic2 on top of dynamic1
                    collisionStruct.firstObjectCollisionDirection  = GameValues.CollisionDirectionTop;
                    collisionStruct.secondObjectCollisionDirection = GameValues.CollisionDirectionBottom;
                    collisionHappened = true;
                }
            }
            if (dynamic1.Velocity.X > 0 && !collisionHappened) // dynamic1 is moving right
            {
                // Left side of d2 is farther right than right side of old d1
                if (dynamic2.CollisionRectangle.Left >= dynamicOneOldCollisionRectangle.Right)
                {
                    // dynamic1 on left side of dynamic2 : dynamic2 on right side of dynamic1
                    collisionStruct.firstObjectCollisionDirection  = GameValues.CollisionDirectionRight;
                    collisionStruct.secondObjectCollisionDirection = GameValues.CollisionDirectionLeft;
                }
            }
            else if (dynamic1.Velocity.X < 0 && !collisionHappened) // dynamic1 is moving left
            {
                // Right side of d2 is farther left than left side of old d1
                if (dynamic2.CollisionRectangle.Right <= dynamicOneOldCollisionRectangle.Left)
                {
                    // dynamic1 on right side of dynamic2 : dynamic2 on left side of dynamic1
                    collisionStruct.firstObjectCollisionDirection  = GameValues.CollisionDirectionLeft;
                    collisionStruct.secondObjectCollisionDirection = GameValues.CollisionDirectionRight;
                }
            }

            return(collisionStruct);
        }
        public void DetectCollision(IDynamicObject dynamic1)
        {
            foreach (IDynamicObject dynamic2 in Level.Instance.DynamicObjects)
            {
                // Make sure that dynamic1 is not the same object as dynamic2, and dynamic1 is on screen, and they're intersecting (might change second check to if the objects are near each other)
                if (dynamic1 != dynamic2 && Math.Abs(dynamic2.Position.X - Mario.Instance.Position.X) <= GameValues.CollisionManagerDetectCollisionMax && dynamic1.CollisionRectangle.Intersects(dynamic2.CollisionRectangle))
                {
                    dynamicCollisionStruct = CalculateCollisionDirection(dynamic1, dynamic2);

                    dynamic1.HandleDynamicCollision(dynamicCollisionStruct.firstObjectCollisionDirection, dynamic2);
                    dynamic2.HandleDynamicCollision(dynamicCollisionStruct.secondObjectCollisionDirection, dynamic1);
                }
            }

            foreach (IStaticObject staticObject in Level.Instance.StaticObjects)
            {
                if (dynamic1.CollisionRectangle.Intersects(staticObject.CollisionRectangle))
                {
                    staticCollisionStruct = CalculateCollisionDirection(dynamic1, staticObject);

                    dynamic1.HandleStaticCollision(staticCollisionStruct.firstObjectCollisionDirection, staticObject);
                }
            }
        }