Создание процедурной анимации смерти при помощи автоматов падающего песка

Автор оригинала: Pierre Vigier
  • Перевод
В этом посте я покажу, как использовал автоматы падающего песка для генерации анимаций смерти монстров в моей игре Vagabond.



Автоматы падающего песка


Автомат падающего песка — это клеточный автомат, симулирующий перемещение песчинок и создание куч песка под действием гравитации.

Правила просты:

  • Если ячейка под песчинкой пуста, то песчинка движется в пустую ячейку (см. (a)).
  • Если ячейка под песчинкой заполнена, но свободна ячейка внизу слева или внизу справа, то песчинка движется туда (см. (b)). Если свободны обе, то одна из них выбирается случайным образом.
  • В остальных случаях песчинка не движется.


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

С помощью этих простых правил можно получить вот такие анимации:


Генерирование анимаций смерти


Теперь давайте посмотрим, как можно использовать автоматы падающего песка для создания анимаций смерти монстров.

Принцип заключается в том, чтобы считать непрозрачные пиксели изображения песчинками и заставить их падать, создавая кучу «песка» из трупа монстра. Единственное отличие от представленных выше правил заключается в том, что каждая песчинка теперь имеет цвет. Вот что мы получим:


Мне кажется, что такой результат не особо красив по двум причинам: куча слишком высока и всё падает с одинаковой скоростью.

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


Чтобы получить изображение из 3D-состояния клеточного автомата, я проецирую состояние в 2D, беря для каждой пары координат (i, j) первую непрозрачную ячейку, где переменная k выполняет итеративный обход слоёв. Вот результат для трёх слоёв:


Чтобы улучшить ситуацию со скоростью, я рандомизирую количество строк, на которое падает песчинка за один шаг в интервале от 1 до $n$. На практике я использую $n = 2$ или $n = 3$. Вот результат:


При этом во время расщепления монстра при падении создаются дырки.

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


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

Полный скрипт выложен на GitHub.

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

Похожие публикации

Средняя зарплата в IT

120 000 ₽/мес.
Средняя зарплата по всем IT-специализациям на основании 7 380 анкет, за 1-ое пол. 2021 года Узнать свою зарплату
Реклама
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее

Комментарии 9

    0
    Отдельные песчинки, которые выше, должны падать медленнее. Другой вопрос, что любая фаза в игре не должна быть слишком долгой. Но так натуральнее
      –1

      С такой короткой анимацией и общей не-натуральной графикой(натуральные слаймы и гигантские осы?) не похоже чтобы это глаз цепляло

        0
        В играх, где такая пиксельная графика, любая «натуральность» условная.
        В этом и есть их шарм, мне кажется
        +6
        Простенько и со вкусом, очень хорошее решение для игр в пиксельной стилистике.
        Хотя, возможно, неправильно говорить об этом как о песке, художественная обработка привела к чему-то другому.
          +1
          Если не ошибаюсь, в КА-моделировании этот процесс называется конвекцией, и является элементом более сложных процессов — конвенкция+диффузия=реакция.

          Это я так, умничаю, просто занимался когда-то КА-моделированием.
          За статью спасибо — приятно видеть что КА полезны и по сей день!
            0
            Так вот, как называется алгоритм падения камней в игре Boulder Dash!

            Помню, на Спектруме был клон этой игры под названием «Down to Earth» — там можно было ещё бомбы бросать. Мы с товарищем пытались клонировать эту игру на PC XT — и создание алгоритма падающих камней оказалось непростой задачей. Ведь одновременно может падать много камней. Бывает, случаются конфликты: в одну и ту же свободную клетку хотят попасть два и более камня (например: один сверху и один справа).

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

            А у вас, автор, как разрешаются конфликты?
              0

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

                +3
                Разрешение таких конфликтных ситуаций сломало нам тогда голову.
                Да какой это конфликт, просто перемещать первым того, у кого ид меньше, вот и всё. А автор этой статьи вообще на заморачивался, и стирает с таком случае пиксели.
                –1
                Не быть мне gameдезигнером( Не вижу различий в последних трёх летучих мышах… Автору респект за идею!

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                Самое читаемое