Какие шаги будут задействованы при создании разрушаемого 2D-ландшафта, как в Worms? В идеале, как можно сделать этот процесс максимально эффективным?
Какие шаги будут задействованы при создании разрушаемого 2D-ландшафта, как в Worms? В идеале, как можно сделать этот процесс максимально эффективным?
Ответы:
Я не знаю, как именно реализован пейзаж в червях, но я почти уверен, что они использовали растровое изображение для ландшафта (по крайней мере, в старых играх серии).
Самым базовым подходом было бы растровое изображение (ч / б), где черные пиксели представляют воздух, а белые пиксели представляют землю . Разрушение ландшафта может быть легко выполнено с помощью операций с пикселями. Поэтому, если ракета падает на землю, нарисуйте черный круг radius = blastRadius
в точке удара.
Затем вы можете визуализировать свой мир (или только его часть) с помощью этого растрового изображения. Для лучшей производительности я предлагаю вам реализовать это таким образом, чтобы вы могли обновлять / рендерить только часть «мира». Например. если некоторые части ландшафта будут уничтожены ракетой, просто измените рендеринг затронутых областей, а не всего мира.
Вместо черно-белого изображения в качестве вашей «карты столкновений», вы также можете использовать 24-битное изображение, где вы используете два канала для хранения нормали поверхности (x, y) на пиксель и один канал для хранения фактического «столкновения - карта". Наличие под рукой нормали поверхности очень поможет вам рассчитать прыгающие гранаты или определить, может ли персонаж двигаться в заданном направлении.
Одна возможность от макушки головы:
Используйте представление пути векторной графики для хранения контура разрушаемой «земли». Когда происходит событие уничтожения (например, граната гаснет), область взрыва, представленная в виде круга, будет удалена с наземного пути с помощью логической операции вычитания. Полученный путь представляет новую «землю» для обнаружения столкновения с землей, а также, возможно, маску для рисования земли.
Я написал доказательство концепции, которая использовала конструктивную твердую геометрию для обработки разрушаемой местности. Я использовал GLU Tessellator для выполнения логических операций. В документации объясняется, как выполнить поиск «Использование CSG для правил намотки» .
Я подал треугольный выход тесселлятора в виде статических многоугольников в Box2D. PoC работал довольно хорошо. Я смог произвольно вычесть и добавить ландшафт в режиме реального времени, и ландшафт продолжал вести себя соответствующим образом с Box2D. Единственный настоящий сбой заключался в том, что тесселлятор GLU может создавать вырожденные треугольники, которые Box2D не любит, поэтому мне пришлось отфильтровать их вручную.
Следующим шагом в PoC (который я никогда не получал) было использование алгоритма SCC из библиотеки графов надстроек, чтобы определить, когда часть местности была оторвана (срезать вершину с горы). Разорванная местность все еще будет разрушаемой, но теперь она представлена динамическим (нестатичным) телом Box2D с треугольниками, прикрепленными в виде фигур. Я разработал дизайн, но потерял интерес, как только начал копаться в документации надстройки. Я «планирую» вернуться к этой идее, когда сделаю когда-нибудь игру с выжженной землей / червями.
Все ответы выше говорят о реализации простейшего случая, как у червей. То есть когда зона воздействия разрушена, а все остальное остается нетронутым. Считаете ли вы, что ваш пейзаж может в конечном итоге разделиться на две части? Скажем, есть гора, и игроки обрезают ее с помощью ракетной установки. Теперь, не должна ли гора упасть? Кроме того, было бы естественно, чтобы пейзаж был немного упругим. Во времена Worms (по крайней мере, насколько я их помню, я не играл в Worms, например, много лет), компьютеры не были достаточно сильны, чтобы делать это правильно. Но они сейчас.
Конечно, это полностью зависит от амбиций вашего проекта. Но если вы хотите, чтобы это было действительно круто, возможно, вам стоит попробовать Box2D в качестве физического движка. С этим можно многое сделать.
Как сказал Буммзэк Битмапы. Хотя вы можете использовать 1-битную прозрачную пленку или, если у вас ее нет, используйте ужасный розовый цвет, который вы не используете в своей игре.
Точку удара можно рассчитать, просто проверив цвет пикселя. и когда происходит воздействие, измените цвет (или удалите его) растрового изображения.
Что касается радиуса взрыва, моей первой остановкой был бы алгоритм круга Брезенхэма , очень быстрый и эффективный. Несмотря на то, что сначала я бы удалил строку с чем-то вроде квадрата и обвел ее кружком, чтобы получить края.