Каков наилучший подход к обнаружению 2D-столкновений на iPhone? - PullRequest
2 голосов
/ 19 апреля 2010

Я работал над этой проблемой обнаружения столкновений, и, кажется, есть 3 основных подхода, которые я мог бы предпринять:

  1. Подход спрайта и маски. (И наложение спрайтов и проверка ненулевого числа в результирующих данных пикселя спрайта).

  2. Ограничивающие круги, прямоугольники или многоугольники. (Создайте одну или несколько фигур, которые заключают в себе спрайты и выполните основные математические расчеты, чтобы проверить совпадения).

  3. Использовать существующую библиотеку спрайтов.

Первый подход, хотя это было бы так, как я делал бы это в старые времена спрайтовых блоков 16x16, похоже, что просто не существует простого способа получить данные отдельных пикселей изображения и / или альфа-канал в Кварце (или OPENGL в этом отношении). Обнаружить перекрытие ограничивающего прямоугольника легко, но затем создать третье изображение из перекрытия и затем проверить его на наличие пикселей сложно, и я чувствую, что даже если бы мы могли заставить его работать, это было бы медленно. Я что-то упустил здесь?

Второй подход заключается в разделении наших спрайтов на несколько полигонов и проверке их на совпадения. Чем больше полигонов, тем точнее обнаружение столкновений. Преимущество в том, что это быстро и может быть точным. Недостатком является то, что это делает создание спрайтов более сложным. то есть мы должны создать полигоны для каждого спрайта. Для скорости лучше всего создать дерево многоугольников.

Третий подход, в котором я не уверен, это покупка кода (или использование лицензии с открытым исходным кодом). Я не уверен, какую библиотеку лучше всего использовать, или она облегчит жизнь или создаст нам проблему с ее интеграцией в наше приложение.

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

С наилучшими пожеланиями

Dave

1 Ответ

5 голосов
/ 19 апреля 2010

Рассмотрите возможность полигонизации ваших спрайтов. Держите полигональное представление для ваших спрайтов "на заднем плане" и проводите тестирование столкновений с полигонизированной версией вашего игрового мира. Это создает некоторые накладные расходы и дополнительную сложность, но часто очень полезно с точки зрения дополнительных возможностей. (динамические тени, эффекты освещения, обнаружение столкновений независимо от спрайтовой графики, многие другие методы обнаружения столкновений, полигональное пересечение и т. д.)

В противном случае вы застряли на пиксельном подходе, который вы описали, что тоже неплохо. (ИЛИ перекрытие) Вы можете просто сделать это самостоятельно или позволить OpenGL сделать это в буфере кадров. (Я не могу вспомнить звонки, думаю, это называлось z-masking (?), ... извините. Для небольших спрайтов это может быть даже медленнее ...) Рассмотрите возможность использования методов разбиения двоичного пространства для оптимизации некоторых из них:

Например, четырехугольные деревья позволяют быстро находить спрайты-кандидаты для тестирования столкновений. Они применимы как на пиксельном, так и на вершинном подходе. Или просто используйте BSPTrees.

Кстати: я думаю, что точность пикселей при обнаружении столкновений на самом деле хорошая функция, я часто использовал ее в Jump'n Runs. Возможно, это не относится к вашей игре.

...