iOS - Как определить, сталкиваются ли два или более объекта - PullRequest
0 голосов
/ 06 февраля 2012

Как я могу обнаружить, если два или более объектов сталкиваются? Я хотел бы использовать только стандартные рамки, такие как Core Graphics. Или я должен использовать Box2d или Cocos2d?

EDIT Вы правы, вопрос не совсем понятен. Итак, вот такая ситуация: У меня есть несколько UIImageView, которые движутся с акселерометром, но я хочу, чтобы при столкновении двух или более изображений они не перекрывали друг друга. Это понятно?

Ответы [ 2 ]

1 голос
/ 06 февраля 2012

Возможно, вы хотите многоэтапный процесс.

Сначала определите «центр» и «радиус» для каждого объекта так, чтобы линия, проведенная вокруг центра на выбранном радиусе, полностью охватывала объект без «слишком большого дополнительного».(Вы определяете, насколько усердно вы работаете, чтобы определить центр и радиус, чтобы предотвратить «слишком много».)

Необязательный следующий шаг - как-то разделить экран на квадранты / секции и вычислить, какие объекты (основываясь на их центрах)и радиусы) полностью лежат в одном квадранте, который охватывает границу квадранта, который охватывает 4 квадранта и т. д. Это позволяет поднаборить следующий шаг и рассматривать только пары объектов, которые находятся в одном и том же квадранте или где один из двух является промежуточнымтого или иного рода.

Затем между каждой парой объектов рассчитайте расстояние от центра до центра, используя теорему Пифагора.Если это расстояние меньше суммы радиусов двух объектов, то у вас есть потенциальное столкновение.

Наконец, вам нужно немного разбираться в расчетах реальных столкновений.Есть несколько разных подходов, в зависимости от формы ваших объектов.Очевидно, что круги покрыты предыдущим шагом, квадраты / прямоугольники (выровненные по осям X / Y) могут быть вычислены довольно хорошо, но нечетные формы сложнее.Одна из схем состоит в том, чтобы на паре «пустых» полотен нарисовать два объекта, а затем И вместе, два пикселя за пикселем, чтобы увидеть, где вы найдете 1 где-нибудь.Существует несколько вариантов этой схемы.

0 голосов
/ 06 февраля 2012

Как уже упоминалось, ваш вопрос довольно расплывчатый, и поэтому трудно ответить кратко. Но чтобы дать вам некоторые идеи, вы можете сделать это с помощью основной анимации, хотя некоторые сторонние игровые движки / фреймворки могут быть более эффективными.

По сути, вы создаете таймер, который срабатывает довольно часто (как часто будет зависеть от размера объектов, с которыми вы сталкиваетесь, и их скорости - слишком медленно, и объекты могут сталкиваться и проходить друг перед другом, прежде чем таймер сработает - математика твой друг здесь).

Каждый раз, когда срабатывает таймер, вы проверяете каждый объект на экране на предмет столкновения с остальными. Для повышения эффективности вы должны проверять каждую пару только один раз - т.е. если у вас есть объекты A, B, C, D, проверьте A & D, но не D & A.

Если у вас есть обработчик столкновения, как вы хотите (анимация / точки / уведомления / все, что вы хотите сделать).

Слишком много, чтобы освещать здесь пост. Я бы посоветовал проверить отличную рецензию на игру «Астероиды» на cocoawithlove, особенно в части 3 (хотя не в iOS, принципы одинаковы): http://cocoawithlove.com/2009/03/asteroids-style-game-in-coreanimation.html

...