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

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

75 голосов | спросил William Casarin 22 WedEurope/Moscow2010-12-22T06:12:53+03:00Europe/Moscow12bEurope/MoscowWed, 22 Dec 2010 06:12:53 +0300 2010, 06:12:53

5 ответов


46

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

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

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

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

ответил bummzack 22 WedEurope/Moscow2010-12-22T10:10:53+03:00Europe/Moscow12bEurope/MoscowWed, 22 Dec 2010 10:10:53 +0300 2010, 10:10:53
6

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

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

ответил Phillip Parker 22 WedEurope/Moscow2010-12-22T07:26:31+03:00Europe/Moscow12bEurope/MoscowWed, 22 Dec 2010 07:26:31 +0300 2010, 07:26:31
6

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

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

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

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

ответил deft_code 6 PMpWed, 06 Apr 2011 23:57:00 +040057Wednesday 2011, 23:57:00
5

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

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

ответил Septagram 28 TueEurope/Moscow2010-12-28T10:28:33+03:00Europe/Moscow12bEurope/MoscowTue, 28 Dec 2010 10:28:33 +0300 2010, 10:28:33
3

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

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

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

ответил PhilCK 28 TueEurope/Moscow2010-12-28T07:47:32+03:00Europe/Moscow12bEurope/MoscowTue, 28 Dec 2010 07:47:32 +0300 2010, 07:47:32

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132