#region File Description //----------------------------------------------------------------------------- // RectangleExtensions.cs // // Microsoft XNA Community Game Platform // Copyright (C) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #endregion using System; using Microsoft.Xna.Framework; namespace Platformer { /// /// A set of helpful methods for working with rectangles. /// public static class RectangleExtensions { /// /// Calculates the signed depth of intersection between two rectangles. /// /// /// The amount of overlap between two intersecting rectangles. These /// depth values can be negative depending on which wides the rectangles /// intersect. This allows callers to determine the correct direction /// to push objects in order to resolve collisions. /// If the rectangles are not intersecting, Vector2.Zero is returned. /// public static Vector2 GetIntersectionDepth(this Rectangle rectA, Rectangle rectB) { // Calculate half sizes. float halfWidthA = rectA.Width / 2.0f; float halfHeightA = rectA.Height / 2.0f; float halfWidthB = rectB.Width / 2.0f; float halfHeightB = rectB.Height / 2.0f; // Calculate centers. Vector2 centerA = new Vector2(rectA.Left + halfWidthA, rectA.Top + halfHeightA); Vector2 centerB = new Vector2(rectB.Left + halfWidthB, rectB.Top + halfHeightB); // Calculate current and minimum-non-intersecting distances between centers. float distanceX = centerA.X - centerB.X; float distanceY = centerA.Y - centerB.Y; float minDistanceX = halfWidthA + halfWidthB; float minDistanceY = halfHeightA + halfHeightB; // If we are not intersecting at all, return (0, 0). if (Math.Abs(distanceX) >= minDistanceX || Math.Abs(distanceY) >= minDistanceY) return Vector2.Zero; // Calculate and return intersection depths. float depthX = distanceX > 0 ? minDistanceX - distanceX : -minDistanceX - distanceX; float depthY = distanceY > 0 ? minDistanceY - distanceY : -minDistanceY - distanceY; return new Vector2(depthX, depthY); } /// /// Gets the position of the center of the bottom edge of the rectangle. /// public static Vector2 GetBottomCenter(this Rectangle rect) { return new Vector2(rect.X + rect.Width / 2.0f, rect.Bottom); } } }