Столкновение между Rect и другим неизвестным Rect

Мне было интересно, можно ли узнать, сталкивается ли Rect с другим Rect. Проблема в том, что я не знаю, что / где этот другой Rect.

  1. У меня есть Rect, который движется (я знаю, где он).

  2. У меня на той же "карте" много других Rects.

  3. Я не хочу составлять список всех Rects на карте, а затем пытаться столкнуться с каждым из них.

Есть ли у кого-нибудь в этих обстоятельствах идея для функции, которая принимает Rect и возвращает список всех других Rect, с которыми он сталкивается? (Без использования функции collideRect для всех существующих Rects?)

Могу ли я каким-то образом «сканировать» только область первого прямоугольника, и если в том же «месте» есть еще один прямоугольник, я верну другой прямоугольник?

Пока ничего не придумал ...


person Cribber    schedule 04.09.2015    source источник
comment
Значит, вы в основном хотите проверить, не сталкивается ли Rect с другим Rect, не проверяя, что они сталкиваются?   -  person sloth    schedule 07.09.2015


Ответы (1)


В какой-то момент вам нужно будет проверить, не сталкивается ли Rect с каким-либо другим Rect. Имея это в виду, есть несколько способов ускорить процесс, в основном полагаясь на группировку Rects.

Например, если эти прямоугольники являются объектами на уровне, которые не перемещаются, вы можете отсортировать их по координате X и запомнить максимальную ширину. Если вы хотите запустить обнаружение столкновений, начните с левой стороны основного Rect за вычетом максимальной ширины и проходите до правой стороны Rect. Любые Rects за пределами этого диапазона не могут столкнуться, и поэтому не нуждаются в проверке.

В качестве альтернативы вы можете разделить уровень, скажем, на 16 квадратов и дать каждому квадрату список всех прямоугольников внутри квадрата. Затем просто решите, в каком квадрате находится основной прямоугольник, и просто сравните с находящимися там прямоугольниками. (Конечно, с логикой совпадений.)

Есть множество способов сделать это.

person user3757614    schedule 04.09.2015
comment
но как мне справиться с перемещением Rects? как и изменение их константы x / y, я не могу постоянно использовать список. Я предполагаю, что разделение уровня было бы одной идеей, я не знаю, как это понять - person Cribber; 10.09.2015
comment
Переместить Rects, а затем повторно классифицировать их? Если они не будут много перемещаться, они не получат слишком большого нарушения порядка в течение нескольких кадров, поэтому вы можете добавить максимальное расстояние перемещения и повторять сортировку только один раз через каждые N кадров. - person user3757614; 10.09.2015