Реализация 2D разрушаемого ландшафта (например, Worms)

76

Какие шаги будут задействованы при создании разрушаемого 2D-ландшафта, как в Worms? В идеале, как можно сделать этот процесс максимально эффективным?

Уильям Казарин
источник
7
Отличный вопрос. У червей есть две проблемы: разрушаемость, а также движение по странным углам.
ashes999
я думаю, что здесь уже несколько раз спрашивали
Вишну
2
Виш, ссылки, по-видимому, не говорят об этом.
Коммунистическая утка
3
Вы можете проверить, как это делается в Hedgewars - это клон Worms с открытым исходным кодом.
GvS
Недостаточно для ответа, но вы можете также проверить Клонка . Это старая 2D-игра немецкого разработчика, которая также имеет разрушаемый ландшафт, вплоть до определенных пикселей. Он больше не разрабатывается, но исходный код доступен по ссылке выше. Есть также преемник OpenClonk с открытым исходным кодом, но из видеороликов он, похоже, отошел от идеального уничтожения пикселей и повернул в направлении Terraria-esque с видами блоков, которые можно разрушить.
Кристиан,

Ответы:

47

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

Самым базовым подходом было бы растровое изображение (ч / б), где черные пиксели представляют воздух, а белые пиксели представляют землю . Разрушение ландшафта может быть легко выполнено с помощью операций с пикселями. Поэтому, если ракета падает на землю, нарисуйте черный круг radius = blastRadiusв точке удара.

Затем вы можете визуализировать свой мир (или только его часть) с помощью этого растрового изображения. Для лучшей производительности я предлагаю вам реализовать это таким образом, чтобы вы могли обновлять / рендерить только часть «мира». Например. если некоторые части ландшафта будут уничтожены ракетой, просто измените рендеринг затронутых областей, а не всего мира.

Вместо черно-белого изображения в качестве вашей «карты столкновений», вы также можете использовать 24-битное изображение, где вы используете два канала для хранения нормали поверхности (x, y) на пиксель и один канал для хранения фактического «столкновения - карта". Наличие под рукой нормали поверхности очень поможет вам рассчитать прыгающие гранаты или определить, может ли персонаж двигаться в заданном направлении.

bummzack
источник
3
Хранение дополнительной информации - карта столкновений - прекрасная идея.
deft_code
6

Одна возможность от макушки головы:

Используйте представление пути векторной графики для хранения контура разрушаемой «земли». Когда происходит событие уничтожения (например, граната гаснет), область взрыва, представленная в виде круга, будет удалена с наземного пути с помощью логической операции вычитания. Полученный путь представляет новую «землю» для обнаружения столкновения с землей, а также, возможно, маску для рисования земли.

Филипп Паркер
источник
2
Я думаю, что именно так это и делают хеджевары. @ Билл, вы могли бы взглянуть на это, так как с открытым исходным кодом.
Гастон
2
@ Gastón Все карты в Hedgewars являются изображениями (PNG). Я сомневаюсь, что они конвертируются в векторную графику. Кроме того: использование векторной графики (сплайны, Безье и т. Д.) Значительно увеличивает нагрузку на процессор для таких вещей, как обнаружение столкновений или вычитание фигур. Глядя на источник - хорошая идея (хотя стиль кодирования довольно плохой :))
bummzack
4
Такая вычислительная геометрия может быть ОЧЕНЬ сложной, ОЧЕНЬ быстрой!
Адам Харт
Поиск в гугле "box2d destructible terrain" теперь дает несколько управляемых векторных демонстраций.
Сиро Сантилли 新疆 改造 中心 法轮功 六四 事件
6

Используйте конструктивную твердую геометрию

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

Я подал треугольный выход тесселлятора в виде статических многоугольников в Box2D. PoC работал довольно хорошо. Я смог произвольно вычесть и добавить ландшафт в режиме реального времени, и ландшафт продолжал вести себя соответствующим образом с Box2D. Единственный настоящий сбой заключался в том, что тесселлятор GLU может создавать вырожденные треугольники, которые Box2D не любит, поэтому мне пришлось отфильтровать их вручную.

Следующим шагом в PoC (который я никогда не получал) было использование алгоритма SCC из библиотеки графов надстроек, чтобы определить, когда часть местности была оторвана (срезать вершину с горы). Разорванная местность все еще будет разрушаемой, но теперь она представлена ​​динамическим (нестатичным) телом Box2D с треугольниками, прикрепленными в виде фигур. Я разработал дизайн, но потерял интерес, как только начал копаться в документации надстройки. Я «планирую» вернуться к этой идее, когда сделаю когда-нибудь игру с выжженной землей / червями.

deft_code
источник
5

Все ответы выше говорят о реализации простейшего случая, как у червей. То есть когда зона воздействия разрушена, а все остальное остается нетронутым. Считаете ли вы, что ваш пейзаж может в конечном итоге разделиться на две части? Скажем, есть гора, и игроки обрезают ее с помощью ракетной установки. Теперь, не должна ли гора упасть? Кроме того, было бы естественно, чтобы пейзаж был немного упругим. Во времена Worms (по крайней мере, насколько я их помню, я не играл в Worms, например, много лет), компьютеры не были достаточно сильны, чтобы делать это правильно. Но они сейчас.

Конечно, это полностью зависит от амбиций вашего проекта. Но если вы хотите, чтобы это было действительно круто, возможно, вам стоит попробовать Box2D в качестве физического движка. С этим можно многое сделать.

Septagram
источник
3
В червях вы можете вырыть яму в ландшафте, используя факел. Не было бы так смешно, если бы этот туннель просто рухнул на твоего бедного, владеющего факелами червя. Также было возможно иметь куски ландшафта, «плавающие» в воздухе. Ваше предложение звучит как забавная идея, просто не как игра Worms.
bummzack
В этом весь смысл, я думал о вариациях этого игрового процесса. Кроме того, некоторые части ландшафта могут быть неразрушимыми и / или навсегда подвешенными в воздухе, что позволит вам создавать «плавающие» блоки. Кроме того, к некоторым из них может быть приложена постоянная сила, тянущая их вверх или вбок, как это делали воздушные шарики в Мире Гуу.
Septagram
Это забавно, потому что я действительно думал о создании такой игры, это было бы забавным поворотом для механика Worms. Идея растровых твердых тел определенно была бы интересной темой сама по себе, хотя сложность немного над моей головой.
Уильям Казарин
Ну, в этом случае растровые твердые тела были бы бесполезны, вместо этого я бы сделал ландшафт в виде трехугольной сетки вершин, упруго связанных. Вы играли в мир Goo? Если нет, см. Скриншоты: vgchartz.com/games/pics/6644424aaa.jpg doublegames.de/images/screenshots/world-of-goo_1_big.jpg . Нет, нет, нет, нет, если вы не играли в это, вы абсолютно обязаны :) Теперь представьте, что вместо шариков с липкими шариками каждый треугольник отображает часть вашей ландшафтной текстуры, и они намного меньше. Поиграйтесь с константами, и ваш пейзаж будет либо довольно жестким, либо мягким, как желе
Septagram
2
взгляните на физический двигатель . Весь двигатель основан на идее, что все является деформируемой / разрушаемой решеткой (как башня с липучкой).
deft_code
3

Как сказал Буммзэк Битмапы. Хотя вы можете использовать 1-битную прозрачную пленку или, если у вас ее нет, используйте ужасный розовый цвет, который вы не используете в своей игре.

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

Что касается радиуса взрыва, моей первой остановкой был бы алгоритм круга Брезенхэма , очень быстрый и эффективный. Несмотря на то, что сначала я бы удалил строку с чем-то вроде квадрата и обвел ее кружком, чтобы получить края.

PhilCK
источник