Як створити реалістичне виявлення зіткнень у 2D рольових іграх?


9

Мені завжди хотілося створити старомодну 2D рольову гру, як «Зоряний океан», «Фінальна фантазія», «Меч Мани» та навіть серії «Казки», і, мабуть, багато людей це роблять. Але перш ніж писати єдиний рядок коду, я робив багато досліджень, малювання та спроб.

Я знайшов майже всі відповіді на свої запитання, але є проблема, яку я не змогла вирішити: Як створити реалістичне, але все ж просте виявлення зіткнень , як в іграх, яких я назвав раніше?

Я вже знаю кілька способів обчислення виявлення зіткнень, подивіться наступні приклади:

Приклади виявлення зіткнень

Жодне з них не задовольняє моїх потреб.

  • Зіткнення на основі плитки занадто прості і підходять більше для Zelda, ніж для Зоряного океану. Плюс креслення кожної плитки потрібно заповнити весь простір, щоб виглядати реалістично.
  • Pixel-perfect має занадто багато обмежень. Якщо ваша плитка має десь піксель, плеєр, швидше за все, застрягне в середині ніде (тобто: в деяких іграх ви застрягнете на корені дерева шириною 2 пікселі).
  • А двійкові маски використовують занадто багато пам’яті та налаштувань imo.

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


2
Яке середовище ви розробляєте, щоб маски зіткнення забирали занадто багато пам’яті? Це справді не викликає занепокоєння для більшості сучасних систем, і маски зіткнення дійсно звучать як те, що ви шукаєте.
Григорій Ейвери-Вейр

Я більшу частину часу розробляю на ПК за допомогою XNA, але останнім часом я думав запустити проект на WP7. Проблема, яку я мав із масками зіткнення, полягала в тому, що за допомогою невеликої роздільної здатності вона діяла так, як це було б ідеально для пікселів, зробивши, наприклад, мого персонажа в кутку. Тому, якщо ви не використовуєте криву Безьє для плавного руху, вам потрібно бути дуже обережним у створенні маски.
Аймерік

Відповіді:


9

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

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

Де я працюю, ми зробили досить багато платформерів і кілька розвідувальних ігор згори вниз. Ми ними займаємося з днів GBA. Ми найчастіше використовуємо AABB для символів та об’єктів, які можна настроїти в редакторі спрайтів, і ми з глузду збуваємо тут, дозволяючи тонна коробок на спрайт, деякі з різною метою. У нас може бути:

  • одна або кілька короб для зіткнення, що описують форму предмета для наїзду на речі;
  • можливо, багато "ящиків для атаки", які виникають лише тоді, коли ви знаходитесь в середині атаки (і оживляєте спрайтом), можливо, навіть дві-три на зброю, залежно;
  • кілька «вразливих коробок», які завдають шкоди при попаданні в бойові атаки інших людей - за замовчуванням ми використовуємо коробку зіткнення, але вразливі ящики, як правило, відчувають себе краще, коли вони менші, ніж коробки зіткнення, і ми можемо дозволити таким чином пошкодження з урахуванням місця розташування
  • одне або декілька "вікон активації" на AI, що описує сенсорну область для AI - вони атакують, якщо гравець, наприклад, у цьому регіоні.

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

Таким чином, більша частина виявлення та реагування на зіткнення стає AABB-vs-AABB або AABB-vs-segment. Іноді ми кидаємо по колу проти-щось для снаряда, хоча часто AABB також буде робити тут.

Вам не потрібно багато основних фігур, щоб зробити речі гарними і добре поводитись - це зробить декілька, за умови, що ви зможете налаштувати їх і повторити.


Крім того, не варто погано поєднувати системи разом; зіткнення на основі плитки можуть бути відмінними в деяких областях (представляють більшість вашого світу), але жахливими для взаємодії об'єкт-об'єкт. Це добре; використовувати іншу систему для object-vs-object! Писати взаємодію між двома системами може бути простіше, ніж ви думаєте.

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