Швидке, точне зіткнення 2d


17

Я працюю над 2d шутером зверху вниз, і тепер мені потрібно вийти за рамки моєї основної системи зіткнення прямокутника, що обмежує коробку.

У мене великі рівні з багатьма різними спрайтами, всі вони мають різні форми та розміри. Текстури для спрайтів - це всі квадратні файли png із прозорими фонами, тому мені також потрібен спосіб зіткнення лише тоді, коли гравець заходить у кольорову частину текстури, а не на прозорий фон.

Я планую впоратися зіткненням наступним чином:

  1. Перевірте, чи є спрайти в діапазоні гравця
  2. Зробіть тест на зіткнення прямої рамки
  3. Робіть точне зіткнення (де мені потрібна допомога)

Я не заперечую проти передових методів, тому що я хочу зробити це правильно з урахуванням усіх моїх вимог, але я не знаю, як до цього підійти. Які методи або навіть бібліотеки спробувати. Я знаю, що, напевно, мені знадобиться створити і зберігати якусь фігуру, яка точно відображає кожен спрайт мінус прозорий фон.

Я читав, що на піксель повільно, тому, враховуючи великі рівні та кількість об'єктів, я не думаю, що це було б підходящим. Я також переглянув Box2d, але не зміг знайти багато документації або будь-яких прикладів того, як його налаштувати і працювати з SFML.

Відповіді:


18
  1. Крок перший, створіть сітку та оновіть її для кожного об’єкта, який рухається.
  2. Перевіряйте лише наявність зіткнень між об’єктами в одних і тих же квадратах.
  3. Перевірте, чи перетинається обмежувальне поле об'єктів (їх містить прямокутник).
  4. Перевірте ідеальне зіткнення пікселів, використовуючи контур з низькою роздільною здатністю (див. Фізику гри).
  5. Зробіть звичайну перевірку контуру трасування, як описано в Фізиці гри (Q 2)

Крок 1:

Створіть 2d масив сітки. Кожен об’єкт знає, які квадрати він займає за його позицією x, y, шириною та висотою. Якщо об'єкт переміщений, він очищається від старого квадрата та оновлює новий квадрат, який він займає.

Загалом ця сума займає лише O (n) для n об’єктів. Для будь-якого конкретного об'єкта O (1).

Крок 2:

Виконайте всі перевірки на зіткнення між об'єктами в однакових квадратах. Не потрібно проводити тести на зіткнення між об'єктами в різних квадратах. Об'єкт може займати до чотирьох квадратів, якщо він середнього розміру. Це означає дуже мало перевірок.

Крок 3:

Перевірте перетин між прямокутниками об’єктів. Якщо перехрестя не існує, зупиніться.

Крок 4:

Перевірте, чи є ідеальні зіткнення пікселів між контурами предметів лише всередині області перетину. Він повинен бути досить швидким. Якщо ні, створіть масив 2d-булевого масиву з низькою роздільною здатністю та спершу перевірте його, якщо ви знайдете там зіткнення, вам потрібно буде лише перевірити невеликий сегмент у масиві високої роздільної здатності 2d, заощадивши вам дорогоцінний час.

Будь ласка, прочитайте це для концепції про те, як розділити ваш ігровий світ на сітку квадратів:

Створення ефективної системи виявлення зіткнень

Прочитайте це, щоб зрозуміти, як виявити ідеальні зіткнення пікселів .

Фізика гри / 2D виявлення зіткнень AS3

Ви можете значно покращити продуктивність:

  1. Збереження версії контуру з низькою роздільною здатністю (1/16) для перевірки першої.

  2. Тільки перевірка в тій місцевості, де перетинаються дві прямої кишки.

  3. шляхом грубого поділу контуру на сегменти і лише спочатку перевірки на колізії між сегментами.

Будь ласка, будь ласка, прокоментуйте коментар, і я докладу.

перевірка в районі перехрестя


1
Як сказав Артур, замініть свої кроки 1. і 2. сіткою, а для точного виявлення зіткнень ви можете використовувати версію зображень із низькою роздільною здатністю.
Маркус фон Броаді

1
І якщо вам справді потрібно, ви також можете скористатися подібною методикою моєї відповіді тут: gamedev.stackexchange.com/questions/38481/…
Маркус фон Броаді

Маркус вказує на гарну ідею. Ви повинні використовувати 2d-булевий масив або 1d-масив, який трактується як 2d, і ви можете зберегти 1/2 1/4 1/8 версії низького дозволу цього масиву, щоб прискорити роботу. Це, мабуть, не буде необхідним, оскільки обчислення на 2d-булевих масивах дуже швидко. Це ще корисний інструмент.
вовкдаун

Якщо програвач повністю міститься в одному квадраті на сітці, ви можете перевірити лише об’єкти на цьому квадраті. У гравця може бути відразу чотири сусідні квадрати. Це ви маєте на увазі? Якщо ви маєте на увазі перетин між прямокутниками, так, вам потрібно перевірити лише на зіткнення, якщо вони перетинаються.
вовкдаун

1
Я сподіваюся, що оновлення допоможе зрозуміти речі. Після написання коду ви можете опублікувати його в огляді коду та зв’язати нас для коментарів. codereview.stackexchange.com
wolfdawn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.