Я только начал работать с 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;
}
Который я нашел по вопросу здесь, и, кажется, работает для таких ситуаций, как этот. Но есть небольшая проблема с этим в этой ситуации Вот
Есть ли способ это исправить? Я делаю это неправильно? Должен ли я попробовать другой подход?
Любой совет поможет.
Четкая проверка, находятся ли углы одного прямоугольника внутри другого, — плохая идея:
Простой способ сделать проверку:
if (a.left >= b.right || a.right <= b.left ||
a.top >= b.bottom || a.bottom <= b.top) {
// No intersection
} else {
// Intersection
}
Посмотрите на функции API:
Это решение недействительно. У вас может быть два прямоугольника, которые не пересекаются, и ни одна из вершин не может лежать в другой. Например ((0,0), (10,10))
а также ((5,-5), (7, 15))
, Попробуйте проверить, если боковая сторона один из прямоугольников пересекает другой прямоугольник.