Як мені поводитися з виявленням зіткнення, щоб швидкі предмети не проходили крізь стіни?


14

Я створюю 2d стрілок бокового прокручування, і у мене виникають невеликі проблеми з виявленням зіткнень для куль. Усі, включаючи кулі, - це об'єкти з власними полігонами / методами оновлення.

Проблема полягає в тому, що кулі йдуть швидко, і зі швидкістю 60 кадрів в секунду (на чому гра працює) куля часто пропускатиме прямо через стіну - оскільки вона рухається більше, ніж ширина стіни протягом інтервалу оновлення - і продовжуйте щасливо на своєму шляху, оскільки багатокутники ніколи насправді не перетинаються.

Що я можу зробити з цього приводу? Єдине, що мені вдалося придумати - це намалювати лінію від старої позиції до нової позиції та здійснити виявлення зіткнень на цьому, але малюнок лінії для виявлення зіткнень рекомендується в документації slick2d. Як я можу це вирішити?


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

Відповіді:


9

Стандартні підходи (виберіть один):

  1. Збільште граничну ширину І / АБО зменшіть максимальну швидкість кулі, щоб вона ніколи не могла стрибати через стіну в одному оновленні (запитувачі трохи Піфагора, щоб визначити максимальні відстані / мінімальні граничні ширини);
  2. Виконують безперервне виявлення зіткнень (ПЗЗ), як правило, за допомогою радіовипромінювання для виявлення зіткнення з лінійними (2) або площинними (3D) поверхнями перед рухомим об’єктом. Це дорожче, але є більш чітким рішенням. Передавання радіомовлення проти двовимірних ліній є досить базовим, але вам потрібно визначити всі ваші межі як прямокутні багатокутники в цьому випадку.

З цього питання ви можете замість своїх моделей моделювати кулі як промені - якщо це відповідає вигляду та відчуттю вашої гри, як у left4kdead . Таким чином, вам не потрібно наближати кулі до променів, оскільки вони вже є променями. З точки зору вигляду це може виглядати пристойно, якщо ви намалюєте лінію з яскравішою плямою на кінці кулі або просто намалюєте лінію як градієнт від світлого (кулевий кінець) до темного (кінець хвоста), надаючи йому вигляд рух.

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


Дякую за чудову відповідь - в ідеалі я хотів би, щоб вона швидко рухалася з багатьма рухомими тілами. Причина, що я ставлюся до куль як до фізичних об'єктів, полягає в тому, що на них впливає гравітація, як і все інше (так, дуга трохи знижується в залежності від швидкості кулі тощо). Це не гарний спосіб зробити це? Це моя перша гра, тому я все ще полюю за кращими практиками. Я також міг би використовувати параболічне рівняння, але я не впевнений, як я встановив би коефіцієнти, що відносяться до кута швидкості / цілі кулі
Мала

3
Це звучить як занадто багато деталей для куль. У реальному житті, коли ви стріляєте з кулі, ви навряд чи коли-небудь знайдете цього слимака через силу рикошету, непередбачуваності кута рикошету тощо. Інакше він просто потрапляє в тіло і залишається там (дерево, людина). Я просто змусив би їх зникнути або рикошети, а потім зникне незабаром після цього. Орієнтуйтеся на свій основний геймплей, не турбуйтеся надто про ці дрібні деталі. Реалізм найкраще орієнтований на речі, які мають значення.
Інженер

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

2
Якщо швидкість куль не надто висока (тобто не така швидка, що ви не зможете побачити їх подорож по екрану), тоді ви можете просто застосувати тяжіння до їх швидкості, все ще моделюючи їх виявлення зіткнення за допомогою простих променів. Користувач не збирається помічати, що куля рухається як серія прямих більше, ніж він помітить, як всі ваші інші об’єкти теж роблять те саме. Для кульових стежок, обчислення та малювання вигнутого сліду (сплайну) не є складним і посилить ілюзію плавної кривої до траєкторії кулі.
Шон Міддлічч

3

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

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

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


Спасибі! Я ефективно роблю це (а також використовую снаряди у формі ліній) і сподіваюся, що це стає здійсненним, оскільки гра ускладнюється
Мала
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.