Які кроки були б залучені до побудови руйнівного 2D-ландшафту, як у Worms? В ідеалі, якими є способи зробити цей процес максимально ефективним?
Які кроки були б залучені до побудови руйнівного 2D-ландшафту, як у Worms? В ідеалі, якими є способи зробити цей процес максимально ефективним?
Відповіді:
Я не знаю, як саме був реалізований пейзаж у черв'яків, але я впевнений, що вони використовували растрові зображення для пейзажу (принаймні, у старих іграх серії).
Дуже базовим підходом буде растрове зображення (B / W), де чорні пікселі являють собою повітря, а білі пікселі - земля . Знищення пейзажу можна легко виконати за допомогою піксельних операцій. Тож якщо ракета потрапила в землю, намалюйте чорне коло з radius = blastRadius
точкою удару.
Потім ви можете відобразити свій світ (або лише його частину) за допомогою цієї растрової карти. Для кращої продуктивності я пропоную вам реалізувати його таким чином, щоб ви могли оновити / відтворити лише частину "світу". Напр. якщо деякі частини ландшафту знищені ракетою, просто переведіть на уражені ділянки, а не на весь світ.
Замість B / W-зображення як "карти зіткнення" ви також можете використовувати 24-бітове зображення, де ви використовуєте два канали для зберігання нормальної поверхні (х, у) на піксель і один канал для зберігання фактичного "зіткнення" карта ". Наявність під рукою нормальної поверхні допоможе вам обчислити гранати, що підстрибують, або визначити, чи може персонаж рухатися в заданому напрямку.
Одна можливість з моєї голови:
Використовуйте подання контуру векторної графіки для зберігання обрисів руйнуючої "землі". Якщо трапляється подія руйнування (наприклад, граната згасає), область вибуху, представлена у вигляді кола, буде видалена із сухопутного шляху шляхом булевої операції віднімання. Отриманий шлях представляє нову "землю" для виявлення зіткнень із землею, а також, можливо, маску для нанесення землі.
Я написав доказ концепції, яка використовувала конструктивну суцільну геометрію для обробки руйнуваної місцевості. Я використовував GLU Tessellator для виконання булевих операцій. Документація пояснює , як, пошук «CSG Використання для намотування правил» .
Я подав вихід трикутника tessellator як статичні багатокутники в Box2D. PoC працював досить добре. Мені вдалося довільно відняти та додати місцевість у режимі реального часу, і місцевість продовжувала себе належним чином поводитись із Box2D. Єдиним справжнім гиком було те, що телселятор GLU може виробляти вироджені трикутники, які Box2D не любить, тому мені довелося фільтрувати їх вручну.
Наступним кроком PoC (до якого я ніколи не дійшов) було використання алгоритму SCC з бібліотеки прискорених графіків, щоб виявити, коли шматок місцевості був розрізаний (зрізав вершину з гори). Розрізнений рельєф все ще буде руйнуваним, але тепер представлений динамічним (нестатичним) корпусом Box2D з трикутниками, приєднаними у формі. У мене дизайн був розроблений, але втратив інтерес, як тільки я почав розкопувати документацію про підвищення. Я "планую" переглянути цю ідею, коли я колись буду робити випалену гру / черв'яків.
Усі відповіді, наведені вище, говорять про реалізацію найпростішого випадку, як у черв'яків. Тобто, коли область удару руйнується, а все інше не зачіпається. Чи вважали ви, що ваш пейзаж може врешті-решт розділитися на два частини? Скажімо, там є гора, і гравці підрізають її дно ракетною установкою. Тепер, чи не повинна падати гора? Крім того, було б природно, щоб пейзаж був трохи еластичним. У часи Черв'яків (принаймні, як я їх пам’ятаю, я не грав у Черв'яки, як, наприклад, багато років) комп’ютери були не просто сильними, щоб зробити це правильно. Але вони є зараз.
Звичайно, це повністю залежить від амбіцій вашого проекту. Але якщо ви хочете, щоб це було справді приголомшливо, можливо, ви повинні спробувати Box2D як двигун фізики. З цим можна багато зробити.
Як сказав bummzack Bitmaps. Хоча ви можете використовувати 1-бітні прозорі плівки або якщо у вас немає такої підтримки, використовуйте жахливий рожевий колір, який ви не будете використовувати у своїй грі.
Точку впливу можна обчислити, просто перевіривши колір пікселя. і коли відбувається вплив, змініть колір (або видаліть його) растрової карти.
Що стосується радіусу вибуху, то моєю першою зупинкою був би алгоритм кола Брезена , дуже швидкий та ефективний. Хоча я б спочатку видалив кругленьке щось на зразок квадрата і поклав коло навколо, щоб отримати краї.