1

几天前,我刚刚开始使用 Win32 GUI 编程。我正在尝试制作一个简单的游戏,我需要在其中检测 2 个对象之间的碰撞。所以我用struct制作了我的角色RECT

为了检测它们是否发生碰撞,我使用了:

// Returns 1 if the point (x, y) lies within the rectangle, 0 otherwise
int is_point_in_rectangle(RECT r, int x, int y) {
    if ((r.left   <= x && r.right >= x) &&
        (r.bottom <= y && r.top   >= y))
        return 1;
    return 0;
}

// Returns 1 if the rectangles overlap, 0 otherwise
int do_rectangles_intersect(RECT a, RECT b) {
    if ( is_point_in_rectangle(a, b.left , b.top   ) ||
         is_point_in_rectangle(a, b.right, b.top   ) ||
         is_point_in_rectangle(a, b.left , b.bottom) ||
         is_point_in_rectangle(a, b.right, b.bottom))
        return 1;
    if ( is_point_in_rectangle(b, a.left , a.top   ) ||
         is_point_in_rectangle(b, a.right, a.top   ) ||
         is_point_in_rectangle(b, a.left , a.bottom) ||
         is_point_in_rectangle(b, a.right, a.bottom))
        return 1;
    return 0;
}

我在这里发现了一个问题,它似乎适用于这种情况。但是这里的这种情况有一个小问题

有没有办法解决这个问题?我做错了吗?我应该尝试不同的方法吗?任何提示都会有所帮助。

4

3 回答 3

1

看看 API 函数:

于 2013-03-21T14:56:20.153 回答
1

清楚地检查一个矩形的角是否在另一个矩形内是一个坏主意:

相交的矩形

一种简单的检查方法是:

if (a.left >= b.right || a.right <= b.left ||
    a.top >= b.bottom || a.bottom <= b.top) {

   // No intersection

} else {

   // Intersection

}
于 2013-03-21T15:04:55.840 回答
0

此解决方案无效。您可能有两个矩形相交,而其中任何一个的任何顶点都不位于另一个矩形中。例如((0,0), (10,10))((5,-5), (7, 15))。尝试检查其中一个矩形的一侧是否与另一个矩形相交。

于 2013-03-21T14:57:47.283 回答