📜  矩形碰撞侧检测 (1)

📅  最后修改于: 2023-12-03 15:27:17.467000             🧑  作者: Mango

矩形碰撞侧检测

矩形碰撞侧检测是指在游戏开发中判断两个矩形是否相交,并且判断出两个矩形碰撞的侧面。该算法常用于游戏开发中的物理碰撞检测。

矩形碰撞检测

首先需要判断两个矩形是否相交。如果两个矩形不相交,则它们不会碰撞。可以通过判断两个矩形的 x、y、width 和 height 等属性是否有交集来判断它们是否相交。

public bool IsRectIntersect(Rect rect1, Rect rect2)
{
    return rect1.x < rect2.x + rect2.width &&
           rect1.x + rect1.width > rect2.x &&
           rect1.y < rect2.y + rect2.height &&
           rect1.y + rect1.height > rect2.y;
}

其中,rect1 和 rect2 分别表示两个矩形,返回值为是否相交的布尔值。

碰撞侧检测

如果两个矩形相交,需要判断它们碰撞的侧面。常见的碰撞侧面有左侧、右侧、上侧和下侧。

假设矩形 1 的位置为 (x1, y1),宽度为 w1,高度为 h1,矩形 2 的位置为 (x2, y2),宽度为 w2,高度为 h2,则可以通过以下代码来判断碰撞的侧面。

public Side GetCollisionSide(Rect rect1, Rect rect2)
{
    float xDistance = (rect1.x + rect1.width / 2) - (rect2.x + rect2.width / 2);
    float yDistance = (rect1.y + rect1.height / 2) - (rect2.y + rect2.height / 2);
    float halfWidths = (rect1.width + rect2.width) / 2;
    float halfHeights = (rect1.height + rect2.height) / 2;

    float xOverlap = halfWidths - Mathf.Abs(xDistance);
    float yOverlap = halfHeights - Mathf.Abs(yDistance);

    if (xOverlap > 0 && yOverlap > 0)
    {
        if (xOverlap > yOverlap)
        {
            if (xDistance < 0)
            {
                return Side.Left;
            }
            else
            {
                return Side.Right;
            }
        }
        else
        {
            if (yDistance < 0)
            {
                return Side.Top;
            }
            else
            {
                return Side.Bottom;
            }
        }
    }
    else
    {
        return Side.None;
    }
}

其中,Side 是表示碰撞侧面的枚举类型。代码中使用了 Mathf.Abs() 来计算距离的绝对值,如果需要考虑方向,则需要判断距离的正负性。

总结

矩形碰撞侧检测算法是游戏开发中常用的物理碰撞检测算法之一。该算法可以判断两个矩形是否相交,并且判断出它们碰撞的侧面。对于游戏中的物理碰撞检测,需要结合其他算法和技术来实现完整的碰撞检测系统。