реклама
разместить

Система частиц для игры в стиле ASCII-art

Система частиц — распространённый способ создания эффектов вроде огня, взрывов, дыма и так далее. В этой статье я расскажу, как разработал систему частиц для своей игры Unsigned Character, выполненной в стиле ASCII-art.

Цель: разработать универсальную систему частиц для эффектов пламени, взрыва, шлейфа от снарядов и так далее.

Частицы должны имитировать статичное пламя, а также формировать след за движущимся объектом. Вся графика в игре состоит из символов. Поэтому частицы тоже должны рисоваться символами. И разработать это придётся с нуля. В качестве вдохновения я использовал эти анимации из игры asciident:

1. Поток частиц

Я начал с простого. Частицы спавнятся в фиксированной точке. С некоторым интервалом они поднимаются на строку вверх и рандомно сдвигаются по горизонтали (от -1 до 1 символа). Попутно на каждом уровне (строке) выбирается нужный цвет и рандомный символ из заданного набора для этого уровня.

Распределение цветов и вариантов символа по уровням выглядело как-то так:

private static String _frameVariants[] = { "&@0", "&0", "o0*", "o*'", "*.,", "., ", ". ", ". " }; private static FormattedCharacter.Color _frameColors[] = { FormattedCharacter.Color.White, FormattedCharacter.Color.LightYellow, FormattedCharacter.Color.Yellow, FormattedCharacter.Color.Gray, FormattedCharacter.Color.Gray, FormattedCharacter.Color.Gray, FormattedCharacter.Color.Gray, FormattedCharacter.Color.Gray, };

2. Синхронизация потоков

Далее хочется получить более «объёмное» пламя. Поэтому спавним несколько частиц за раз (по умолчанию 3).

Частицы спавнятся в одной точке и могут попадать на одинаковые координаты на следующих уровнях. Поэтому отслеживаем все перекрывающиеся частицы и делаем видимой только одну из них (любую). В результате получаем что-то вроде этого.

Отдалённо напоминает пламя, но выглядит как-то топорно. Если присмотреться к анимации из аскидента, то можно заметить, что частицы там проигрывают некоторую анимацию прежде чем подняться на следующий уровень. Самое время добавить это в проект.

3. Анимация частиц

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

Заодно, я вынес конфигурацию эффектов в json. Вот так выглядит единый набор анимаций частиц:

"animations": [ ".oO0@*", "o0@*", "o&*", ".o&*", "o*'", ".o", ".c*'", ".*", ".,'", ".'", ".' ", ".", ".", " " ],

Каждая строка формирует последовательность «кадров». Можно заметить, что анимации изображают частицу, движущуюся вверх. Из нижнего положения (. или o) в верхнее (* или ').

4. Движение за объектом

У нас есть пламя со статичным источником. Теперь хочется, чтобы источник мог двигаться. В игре физические объекты могут двигаться попиксельно. Их координаты не привязаны к символьной сетке. Но для частиц это недопустимо. Если частицы не будут выровнены по сетке, они будут перекрываться друг с другом, что сильно испортит эффект. Поэтому частицы всегда спавнятся и движутся по символьным координатам. Это создаёт некий рассинхрон. Место спавна частиц не точно совпадает с источником пламени, но это не критично.

Другая проблема — при быстром движении источника огненный след получается очень редким. Решение — спавнить внеочередную частицу в момент, когда источник пламени меняет символьные координаты (строка/столбец).

Если раньше источник был в одном символе, а теперь в другом — спавним в новом месте новую частицу не дожидаясь, когда придёт время обычного спавна. И не просто спавним, а рандомно с заданной вероятностью. Эта вероятность зависит от количества потоков, то есть количества частиц, которое спавнится обычным образом (в пункте 2 мы дали этой величине значение по умолчанию 3).

Кроме того делаем дополнительные модификации, чтобы огонь в движении выглядел реалистичнее.

4.1. Длительность кадра

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

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

4.2. Вероятность подъёма

С ускорением «кадров» частицы начинают быстрее подниматься и формируют более размытый след. Чтобы избежать этого, я немного переделал движение частиц. Теперь при смене кадров они поднимаются не всегда, а рандомно с некоторой вероятностью. Вероятность эта равна 0 на самом первом уровне и поднимается до 1 на самом последнем.

Кроме того, перед подъёмом и сдвигом частицы проверяется пересечение с картой. Частицы не заходят на статичные занятые области уровня.
В итоге получился такой результат:

Этого факела нет в игре, но он отлично демонстрирует работу системы частиц

5. Затухающее пламя

Небольшая модификация позволит сделать пламя, которое разгорается по команде и затухает со временем. Достаточно уменьшать количество потоков (которое до этого всё время было равно 3) и задавать начальное смещение кадра.

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

6. Одноразовый спавн частиц

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

В этом взрыве также создаются два невидимых физических объекта, со своими системами частиц.

7. Ссылки

312312
реклама
разместить
27 комментариев

Ох, шикарно. Если честно, глядя на эти гифки, впервые захотелось поиграть в ASCII игру.

37

Dwarf fortress в помощь)

3

Welcome to the club, buddy

Это ж гениально, блин.

6

Комментарий недоступен

2

Игра уже есть. Отдалённо напоминает пещеру с необычной растительностью.

3
Раскрывать всегда
10 новых игр о которых никто не говорит (но зря!) 2025

Вот честно, иногда кажется, что игровой индустрии нечем удивить. Очередной Assassin’s Creed, ещё один открытый мир и опять нейросети пишут квесты. Стоп! А как насчёт реально крутых и неожиданных игр, которые сейчас никто не обсуждает, но которые заслуживают внимания не меньше, а порой даже больше чем хвалёные ААА? Сегодня о них и поговорим.

359359
1818
77
66
22
22
11
11
Новые игры - это игры, которые вышли, а невышедшие игры - это невышедшие игры. Чего их обсуждать, если их нет?
реклама
разместить
Не вижу разницы
100
158158
8585
1010
77
33
22
22
11
Обе кал получается😎
296296
3838
1414
33
11
11
11
Несколько инсайдеров и журналистов намекнули, что Nintendo проведёт ещё один директ до презентации Switch 2

Вероятно, он будет посвящён играм партнёров.

Несколько инсайдеров и журналистов намекнули, что Nintendo проведёт ещё один директ до презентации Switch 2
2929
44
22
11
11
Мне нужна помощь, чтобы DTFеры помогли разобраться в фундаментальном вопросе:
Как написали на DTF, операция по спасению прошла успешно!
Мне нужна помощь, чтобы DTFеры помогли разобраться в фундаментальном вопросе:
6767
5151
77
22
11
11
11
Ubisoft стоит дешевле CD Projekt Red по нескольким причинам: Финансовые показатели и прибыльность Ubisoft — крупная компания с широким спектром игр и сервисов, но её финансовые показатели в последние годы оставляют желать лучшего. CD Projekt Red (CDPR) хоть и меньше по размеру, но за счёт успеха The Witcher 3 и восстановления репутации после релиза Cyberpunk 2077 показывает высокую маржинальность. Доверие инвесторов CDPR воспринимается как студия с преданными фанатами и сильными IP (The Witcher, Cyberpunk), тогда как Ubisoft теряет доверие из-за конвейерного производства игр, частых задержек и низкого качества новых релизов. Рыночная стратегия Ubisoft выпускает больше игр, но они часто быстро теряют стоимость из-за скидок и монетизации. CDPR делает ставку на редкие, но крупные релизы, что повышает ценность компании в глазах инвесторов. Репутационные проблемы Ubisoft Скандалы внутри компании, уход ключевых разработчиков и неоднозначные решения (NFT, сервисные игры) снижают её привлекательность. CDPR, несмотря на провальный запуск Cyberpunk 2077, сумела восстановить репутацию благодаря крупным обновлениям и расширениям. В итоге рынок оценивает CDPR выше, потому что у неё меньше проблем, выше лояльность аудитории и потенциал роста.
А что, после шестой смены перестают строго следить?
А что, после шестой смены перестают строго следить?
7171
99
11
11
11
Трейлер норвежского боди-хоррора The Ugly Stepsister — это жутковатое переосмысление классической сказки про Золушку

Но если бы ее снимал Дэвид Кроненберг.

5959
33
11
11
Выглядит как минимум необычно и очень интересно. В закладки добавил, спасибо. Такое я люблю.
реклама
разместить
Вообще не понятны хвалебные отзывы касательно Assassin’s Creed Shadows
Вообще не понятны хвалебные отзывы касательно Assassin’s Creed Shadows
4343
2727
22
11
11
11
11
Начинаем новую неделю
Начинаем новую неделю
4848
1616
33
33
22
11
11
11
[]