Как отобразить эффект «распространения слизи» в 2D-среде?

8

Вот пример такого распространения слизи. Вещество распространяется вокруг источника (в этом примере источником будет главное строение пришельцев).

введите описание изображения здесь

Игра Starcraft, фиолетовое вещество называется ползучим.

Как такого рода распространение вещества будет достигнуто в двухмерной среде сверху вниз? Пересчитывать вещества по ходу и регенерировать эффект на лету каждый кадр или, вернее, использовать большую коллекцию плиток или что-то еще?

Натан
источник
Трудно сказать, что вы ищете, точно. Чтобы рискнуть предположить, я бы сделал проход через все плитки, и если плитка пуста, но имеет N плиток, граничащих с инфекцией, то заражает текущую плитку.
Яри ​​Комппа
3
Ключевое слово, которое вы ищете, это "сотовые автоматы".
Мартон
@ Byte56 отличный ответ, довольно ясно. Спасибо, что поделился.
Натан

Ответы:

7

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

Какую плитку использовать, зависит от того:

  1. верхняя плитка заражена или нет
  2. правильная плитка заражена или нет
  3. нижняя плитка заражена или нет
  4. левая плитка заражена или нет

Это означает, что вам нужно всего 16 плиток. Вы можете легко обратиться к ним с помощью битового поля. Вот некоторый псевдокод, который выберет другую плитку для каждого возможного созвездия ползучести:

index = 0;
if left tile is creeped then index += 1
if lower tile is creeped then index += 2
if right tile is creeped then index += 4
if upper tile is creeped then index += 8    
creep_tile = creep_tiles[index]

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

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

Philipp
источник
1
@nathan Также посмотрите Сотовые Автоматы.
инженер
2

Некоторое время назад я читал стратегическую статью, в которой подробно объяснялось, как распространяется крип в Starcraft 2, я изо всех сил пытаюсь найти его сейчас, но я помню, что он довольно простой и работает примерно так

  • Карта Starcraft 2 разбита на тайлы
  • Для каждого источника ползучести каждый «тик» выбирает случайный тайл, который можно распространять на ползучесть и распространять на него
  • Крип может распространиться на любую плитку, которая
    • Рядом с другой плиткой с ползучестью или рядом с источником ползучести
    • В пределах заданного диапазона источника ползучести
    • Не скала

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

Время между «тиками» можно использовать для контроля скорости распространения крипа, в качестве альтернативы вы можете позволить крипу распространяться на несколько плиток в каждом «тике» или даже рандомизировать время между тиками.

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

Джастин
источник
Хорошо, но как насчет ползучего тайла , алгоритм прост, верно, хотя и с чем-то похожим. Но как получить этот естественный , несовершенный эффект, используя плитки?
Натан
@nathan Как ты имеешь в виду? Поскольку ползучая плитка выбрана случайным образом, разброс несовершенен (в отличие от разметки по идеальному кругу). Все остальное делается в графическом движке, выбирая, какие текстуры следует показывать для каждой плитки.
Джастин
да, мой вопрос был больше о том, как выбрать плитку для получения связного эффекта.
Натан
1
@nathan Скорее всего, у них есть много предварительно обработанных спрайтов, которые, когда они расположены рядом друг с другом в правильной комбинации, создают желаемый визуальный эффект.
Панда Пижама
1
@nathan Наверное, следовало бы спросить, как его отобразить, а не как его создать.
MichaelHouse