- PVSM.RU - https://www.pvsm.ru -
В этом посте я покажу, как использовал автоматы падающего песка для генерации анимаций смерти монстров в моей игре Vagabond [1].
Автомат падающего песка — это клеточный автомат [2], симулирующий перемещение песчинок и создание куч песка под действием гравитации.
Правила просты:
Если вы хотите узнать об автоматах падающего песка подробнее, то изучите эту статью [3].
С помощью этих простых правил можно получить вот такие анимации:
Теперь давайте посмотрим, как можно использовать автоматы падающего песка для создания анимаций смерти монстров.
Принцип заключается в том, чтобы считать непрозрачные пиксели изображения песчинками и заставить их падать, создавая кучу «песка» из трупа монстра. Единственное отличие от представленных выше правил заключается в том, что каждая песчинка теперь имеет цвет. Вот что мы получим:
Мне кажется, что такой результат не особо красив по двум причинам: куча слишком высока и всё падает с одинаковой скоростью.
Чтобы решить проблему высоты, я использовал трёхмерный клеточный автомат. Я применил несколько слоёв простого двухмерного клеточного автомата. В исходном состоянии изображение находится в среднем слое, после которого песчинки могут двигаться не только в нижнюю левую или нижнюю правую ячейки, но и в нижние ячейки предыдущего и следующего слоя:
Чтобы получить изображение из 3D-состояния клеточного автомата, я проецирую состояние в 2D, беря для каждой пары координат (i, j) первую непрозрачную ячейку, где переменная k выполняет итеративный обход слоёв. Вот результат для трёх слоёв:
Чтобы улучшить ситуацию со скоростью, я рандомизирую количество строк, на которое падает песчинка за один шаг в интервале от 1 до . На практике я использую
или
. Вот результат:
При этом во время расщепления монстра при падении создаются дырки.
Далее я пропускаю некоторые кадры, чтобы анимации состояли ровно из 6 кадров. Вот готовый результат:
В среднем песчинки падают с постоянной скоростью, однако гравитация должна их ускорять. При желании для симуляции ускорения можно пропускать больше кадров в конце анимации.
Полный скрипт выложен на GitHub [4].
Удобно то, что если вам не понравился результат, то можно запустить скрипт заново с другим seed, и получить новую анимацию. Вот несколько примеров анимации для летучей мыши:
Автор: PatientZero
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/360195
Ссылки в тексте:
[1] Vagabond: https://www.vagabondgame.com/
[2] клеточный автомат: https://en.wikipedia.org/wiki/Cellular_automaton
[3] статью: https://w-shadow.com/blog/2009/09/29/falling-sand-style-water-simulation/
[4] GitHub: https://github.com/pvigier/lpc-scripts/blob/main/death_animation.py
[5] Источник: https://habr.com/ru/post/534544/?utm_source=habrahabr&utm_medium=rss&utm_campaign=534544
Нажмите здесь для печати.