Впровадження 2D руйнівного ландшафту (як черв'яки)


76

Які кроки були б залучені до побудови руйнівного 2D-ландшафту, як у Worms? В ідеалі, якими є способи зробити цей процес максимально ефективним?


7
Відмінне запитання. У черв'яків є два виклики: руйнування, а також рух під дивними кутами.
ashes999

я думаю, про це тут питали вже не раз
Вишну

2
Виш, схожі посилання, схоже, цього не підказують.
Качка комуністична

3
Ви можете перевірити, як це робиться в Hedgewars - це відкритий клон Worms.
GvS

Недостатньо для відповіді, але ви, можливо, захочете перевірити і Clonk . Це старша 2D гра німецького розробника, яка також мала руйнівний пейзаж, аж до конкретних пікселів. Він більше не розробляється, але вихідний код доступний за посиланням вище. Там також є наступник OpenClonk з відкритим кодом, але з відео, схоже, він відійшов від ідеального знищення пікселів і зайняв поворот у напрямку Terraria-esque з різновидами блоків, які можна знищити.
Крістіан

Відповіді:


47

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

Дуже базовим підходом буде растрове зображення (B / W), де чорні пікселі являють собою повітря, а білі пікселі - земля . Знищення пейзажу можна легко виконати за допомогою піксельних операцій. Тож якщо ракета потрапила в землю, намалюйте чорне коло з radius = blastRadiusточкою удару.

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

Замість B / W-зображення як "карти зіткнення" ви також можете використовувати 24-бітове зображення, де ви використовуєте два канали для зберігання нормальної поверхні (х, у) на піксель і один канал для зберігання фактичного "зіткнення" карта ". Наявність під рукою нормальної поверхні допоможе вам обчислити гранати, що підстрибують, або визначити, чи може персонаж рухатися в заданому напрямку.


3
Зберігання додаткової інформації - карта зіткнення - прекрасна ідея.
deft_code

6

Одна можливість з моєї голови:

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


2
Я думаю, що так це робить Hedgewars. @Bill, ви можете поглянути на це, оскільки це відкритий код.
Гастон

2
@ Gastón Карти в їжачках - це всі зображення (PNG). Я сумніваюся, що вони перетворюються на векторну графіку. Також: використання векторної графіки (сплайнів, безьє та ін.) Набагато більша для процесора для таких речей, як виявлення зіткнення або віднімання фігур. Дивлячись на джерело, це гарна ідея (хоча стиль кодування досить поганий :))
bummzack

4
Обчислювальна геометрія, така як ця, може отримати ДУЖЕ складно, ДУЖЕ швидко!
Адам Харте

Гуглінг "box2d зруйнований рельєф" тепер дає кілька демонстраційних векторних демонстрацій.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

6

Використовуйте конструктивну суцільну геометрію

Я написав доказ концепції, яка використовувала конструктивну суцільну геометрію для обробки руйнуваної місцевості. Я використовував GLU Tessellator для виконання булевих операцій. Документація пояснює , як, пошук «CSG Використання для намотування правил» .

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

Наступним кроком PoC (до якого я ніколи не дійшов) було використання алгоритму SCC з бібліотеки прискорених графіків, щоб виявити, коли шматок місцевості був розрізаний (зрізав вершину з гори). Розрізнений рельєф все ще буде руйнуваним, але тепер представлений динамічним (нестатичним) корпусом Box2D з трикутниками, приєднаними у формі. У мене дизайн був розроблений, але втратив інтерес, як тільки я почав розкопувати документацію про підвищення. Я "планую" переглянути цю ідею, коли я колись буду робити випалену гру / черв'яків.


5

Усі відповіді, наведені вище, говорять про реалізацію найпростішого випадку, як у черв'яків. Тобто, коли область удару руйнується, а все інше не зачіпається. Чи вважали ви, що ваш пейзаж може врешті-решт розділитися на два частини? Скажімо, там є гора, і гравці підрізають її дно ракетною установкою. Тепер, чи не повинна падати гора? Крім того, було б природно, щоб пейзаж був трохи еластичним. У часи Черв'яків (принаймні, як я їх пам’ятаю, я не грав у Черв'яки, як, наприклад, багато років) комп’ютери були не просто сильними, щоб зробити це правильно. Але вони є зараз.

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


3
Черв’яки ви могли викопати яму через пейзаж за допомогою факела. Не було б так смішно, якби той тунель просто обвалився на твого бідного хробака, що управляє факелом. Також можна було, щоб шматочки пейзажу «плавали» у повітрі. Ваша пропозиція звучить як забавна ідея, просто не як гра Вормс.
bummzack

У цьому і полягала вся суть, я думав про варіанти в цьому геймплеї. Також деякі частини ландшафту можуть бути незнищенними та / або назавжди підвішеними у повітрі, що дозволить створити «плаваючі» блоки. Крім того, деякі можуть мати постійну силу, прикладену до них, тягнучи їх вгору або вбік, як, наприклад, те, що повітряні кульки робили у Світі Гуо.
Септаграма

Це смішно, тому що я насправді розглядав можливість зробити таку гру, це було б веселим поворотом до механіка Вормса. Ідея жорстких тіл растрових зображень, безумовно, сама по собі була б цікавою темою, хоча складність трохи над головою.
Вільям Касарін

Що ж, у цьому випадку жорсткі тіла растрових зображень будуть невідступними, натомість я б зробив пейзаж у вигляді трикутної сітки вершин, пружно пов'язаних. Ви грали у світ goo? Якщо ні, перегляньте знімки екрана: vgchartz.com/games/pics/6644424aaa.jpg doublegames.de/images/screenshots/world-of-goo_1_big.jpg . Ні, ні, ні, ні, якщо ви не грали в нього, ви абсолютно повинні :) Тепер уявіть, що замість goo кульок кожен трикутник відображає частину вашої текстури пейзажу, і вони набагато менші. Поводьтеся з константами і ваш пейзаж буде або досить жорстким, або м'яким, як желе
Септаграма

2
погляньте на Фізичний двигун . Весь двигун ґрунтується на ідеї, що все є решіткою, що деформується / руйнується (на кшталт гоу-вежі).
deft_code

3

Як сказав bummzack Bitmaps. Хоча ви можете використовувати 1-бітні прозорі плівки або якщо у вас немає такої підтримки, використовуйте жахливий рожевий колір, який ви не будете використовувати у своїй грі.

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

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

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