Базовые FX на GMS2. Составные эффекты

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

Базовые FX на GMS2. Составные эффекты VFX, Gms2, Gamedev, Гифка, Длиннопост

Первое, что хочется сказать: @AZAMATIKA, в прошлом посте давал ссылку на редактор партиклов для GMS2. Лично у меня противоречивые чувства от этой штуки.

Плюсы очевидны: наглядность, возможность редактировать "налету".

Из минусов: чисто гуишные решения под винду, например несколько напрягают (хотя бы то, что параметры нельзя гонять мышкой, только вбивать руками. Есть ощущение, что под огрызком такой проблемы нет, но я не ем яблоки).

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

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

Погнали!

Пара слов теории.

собственно "кольцо огня" из первого поста:

// объявление системы
ring = part_system_create()
// объявление и свойства частиц
ring_part = part_type_create()
part_type_shape(ring_part, pt_shape_ring)
part_type_color_hsv(ring_part, 4,14,80,110,220,250)
part_type_life(ring_part,10,11)
part_type_alpha2(ring_part,0.4,0)
part_type_size(ring_part,0.3,0.3,0.51,0)
part_type_blend(ring_part,0)
//объявление и свойства эммитера
ring_emit = part_emitter_create(ring)
part_emitter_region(ring, ring_emit, x,x,y,y,ps_shape_rectangle,ps_distr_gaussian)
part_emitter_burst(ring, ring_emit, ring_part, 1)

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

Отдельно про прикладное использование. Например: если привязать part_emitter_region к мышке (в поля x и y вписать mouse_x и mouse_y) то эффект всегда будет рождаться под курсором. А если х и у перепутать - то получите зеркалирование относительно главной диагонали. Так, например, можно реализовать какую-нибудь вундервафлю, которой игрок указывает куда упасть.

Базовые FX на GMS2. Составные эффекты VFX, Gms2, Gamedev, Гифка, Длиннопост

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

Базовые FX на GMS2. Составные эффекты VFX, Gms2, Gamedev, Гифка, Длиннопост

разбираемся: разлетающиеся "осколки", взрывная волна, огонь "бушует" внутри кольца ну и само кольцо. Итого 5 штук:

if mouse_check_button_released(mb_left)
{
scr_ring() //кольцо взрывной волны
scr_firering() //кольцо "огня"
scr_turbulence() //беснующийся огоньв нутри кольца
scr_ringsmoke() //дым после взрыва
scr_smallparts() // осколки
}

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

Базовые FX на GMS2. Составные эффекты VFX, Gms2, Gamedev, Гифка, Длиннопост

Собственно, собрав всё это в кучу и получаем то, что на гифке вначале. Этот взрыв гораздо интереснее и красочнее, радует глаз.

Составные эффекты можно реализовывать по-разному, в зависимости от задачи, вот, например две разных реализации огнемётов, вращающихся за курсором:

Базовые FX на GMS2. Составные эффекты VFX, Gms2, Gamedev, Гифка, Длиннопост

левый создан по принципу, что изложен выше: эмиттер из исходной точки выпускает два разных набора частиц.

direction = point_direction(x,y,mouse_x,mouse_y)
flame = part_system_create()
smoke_part = part_type_create()
part_type_shape(smoke_part, pt_shape_explosion)
part_type_color1(smoke_part, c_dkgray)
part_type_life(smoke_part,22,28)
part_type_alpha3(smoke_part,0.0,0.45,0)
part_type_size(smoke_part,0.0,0.6,0.01,0.2)
part_type_speed(smoke_part,10,11,0,2)
part_type_direction(smoke_part,direction-18,direction+18,0,-1.5)
part_type_blend(smoke_part,0)
part_type_orientation(smoke_part,-14,14,4,-1,0.5)


flame_part = part_type_create()
part_type_shape(flame_part, pt_shape_explosion)
part_type_color_hsv(flame_part, 4,15, 230,255,240,255)
part_type_life(flame_part,18,22)
part_type_alpha3(flame_part,0.0,0.6,0)
part_type_size(flame_part,0.3,0.8,-0.02,0.2)
part_type_speed(flame_part,10,11,0,2)
part_type_direction(flame_part,direction-15,direction+15,0,-1)
part_type_blend(flame_part,1)
part_type_orientation(flame_part,-14,14,4,-1,0.5)


flame_emit = part_emitter_create(flame)
part_emitter_region(flame, flame_emit, x-12,x+12,y-12,y+12,ps_shape_rectangle,ps_distr_gaussian)
part_emitter_burst(flame, flame_emit, smoke_part, 18)
part_emitter_burst(flame, flame_emit, flame_part, 18)

по сути - это два разных эффекта (дым и огонь), один эмиттер рождает враз и то и другое.

А правый исповедует несколько иную логику:

direction = point_direction(x,y,mouse_x,mouse_y)
variation = random_range(0,100)

flame = part_system_create()

flame_part = part_type_create()
part_type_shape(flame_part, pt_shape_explosion)
if variation > 50
{
part_type_color1(flame_part, c_dkgray)
part_type_life(flame_part,22,28)
part_type_alpha3(flame_part,0.0,0.55,0)
part_type_size(flame_part,0.0,0.6,0.01,0.2)
part_type_speed(flame_part,12,13,-0.3,2)
part_type_direction(flame_part,direction-18,direction+18,0,-1.5)
part_type_blend(flame_part,0)
part_type_orientation(flame_part,-14,14,4,-1,0.5)
}
else
{
part_type_color_hsv(flame_part, 4,15, 230,255,240,255)
part_type_life(flame_part,18,22)
part_type_alpha3(flame_part,0.0,0.6,0)
part_type_size(flame_part,0.3,0.8,-0.02,0.2)
part_type_speed(flame_part,8,11,0,2)
part_type_direction(flame_part,direction-15,direction+15,0,-1)
part_type_blend(flame_part,true)
part_type_orientation(flame_part,-14,14,4,-1,0.5)
}
flame_emit = part_emitter_create(flame)
part_emitter_region(flame, flame_emit, x-12,x+12,y-12,y+12,ps_shape_rectangle,ps_distr_gaussian)
part_emitter_burst(flame, flame_emit, flame_part, 18)

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

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

Базовые FX на GMS2. Составные эффекты VFX, Gms2, Gamedev, Гифка, Длиннопост

Конкретно здесь это реализовано с помощью параметра part_type_death(). Параметру задается на первом месте частица, которая погибает, потом кол-во рождаемых частиц и в-третьих - тип рождаемых частиц. Соответственно, когда time частицы истекает - она на месте смерте порождает несколько новых частиц, того типа, который будет указан. Такие штуки хорошо использовать для различных атакующих сущностей, типа файерболов, ракет, да что душе угодно, конечно же. Цепная реакция, как она есть, мать её.

Базовые FX на GMS2. Составные эффекты VFX, Gms2, Gamedev, Гифка, Длиннопост

Ну вот, собственно и всё, обзорно по составным эффектам. Ну и фейерверку вам за пройденный уровень! :D

Базовые FX на GMS2. Составные эффекты VFX, Gms2, Gamedev, Гифка, Длиннопост

Лига Разработчиков Видеоигр

6.6K пост22.1K подписчиков

Добавить пост

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"