2015-09-04 5 views
0

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

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

  2. У меня есть много других Ректов на одной и той же «карте».

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

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

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

Я придумал ничего до сих пор ...

+0

Итак, вы в основном хотите проверить, сталкивается ли 'Rect' с другим' Rect', не проверяя, что они сталкиваются? – sloth

ответ

1

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

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

Альтернативно, вы можете разделить уровень, скажем, на 16 квадратов, и дать каждому квадрату список всех Ректов в квадрате. Затем просто определите, в каком квадрате находится главный Rect, и просто сравните с ними Rects. (С логикой для перекрытий, конечно.)

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

+0

, но как мне обращаться с движущимися ребрами? как изменение их x/y постоянной много, я не могу прибегать к списку все время. Я предполагаю, что разделение уровня будет одной идеей, с которой нужно пойти, не бойтесь увидеть, как это выяснить. – Cribber

+0

Переместите ребра, затем примените их/переклассифицируйте? Если они не двигаются много, они не собираются слишком много выходить из строя на нескольких кадрах, поэтому вы можете добавить максимальное расстояние движения и только повторить сортировку только раз в N кадров. – user3757614