Visual C ++ RECT столкновение

Я только начал работать с Win32 GUI, несколько дней назад. Я пытаюсь сделать простую игру, в которой мне нужно обнаружить столкновение между двумя объектами.
Итак, я сделал мой персонажи с помощью 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;
}

Который я нашел по вопросу здесь, и, кажется, работает для таких ситуаций, как этот. Но есть небольшая проблема с этим в этой ситуации Вот

Есть ли способ это исправить? Я делаю это неправильно? Должен ли я попробовать другой подход?
Любой совет поможет.

1

Решение

Четкая проверка, находятся ли углы одного прямоугольника внутри другого, — плохая идея:

Пересекающиеся прямоугольники

Простой способ сделать проверку:

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

// No intersection

} else {

// Intersection

}
1

Другие решения

Посмотрите на функции API:

1

Это решение недействительно. У вас может быть два прямоугольника, которые не пересекаются, и ни одна из вершин не может лежать в другой. Например ((0,0), (10,10)) а также ((5,-5), (7, 15)), Попробуйте проверить, если боковая сторона один из прямоугольников пересекает другой прямоугольник.

0
По вопросам рекламы [email protected]