MrMouseSE

На Пикабу
поставил 286 плюсов и 754 минуса
отредактировал 0 постов
проголосовал за 0 редактирований
3087 рейтинг 44 подписчика 9 подписок 36 постов 2 в горячем

Челенж по выполнению заданий от пикабушников №1.5

В предыдущем посту чего-то никто не выкатил требований, поэтому скомпилировал мини-апдейт из собственных мыслей и частично возмущения @TheodorTalion,

Я подумал что речь была не только о дереве, но и о работающей прокачке умений, описании и тд.

Типа навык "сильный удар" от него разветвления с улучшениями характеристик навыка, возможно несколько взаимоисключающих веток (выбрал одну, вторая заблокировалась) и тд.
Челенж по выполнению заданий от пикабушников №1.5 Unity, C-sharp, Гифка, Длиннопост

Но не совсем. Скилы привязал к визуалу (стырил с инета два атласа иконок), вместо словесных описаний. Получилось посимпатичнее. Ну и реализовал возможность потыкать в прокачку.

Челенж по выполнению заданий от пикабушников №1.5 Unity, C-sharp, Гифка, Длиннопост

Дерево открывается каскадом. Единственное, чего не хватает это "взаимоисключающих" веток. Но тут нужна топология дерева (т.е. чисто геймдизайнерская работа по конкретному балансу) и в рамки задачи уже ну никак не лезет.

Есть ещё вариант с открытым деревом:

Челенж по выполнению заданий от пикабушников №1.5 Unity, C-sharp, Гифка, Длиннопост

З.ы. жду запросов от сообщества. Ну рили, давайте что-нить запрашивайте.

Показать полностью 3

Челенж по выполнению заданий от пикабушников №1

@Dragnair

Реквестирую:
Генератор рандомного дерева навыков для Rpg.
Мелкие пассивки и ключевые навыки, что за навыки пофиг, лишь бы строились более менее осмысленно.

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

Челенж по выполнению заданий от пикабушников №1 Gamedev, C-shapr, Generator, Unity, Гифка, Длиннопост

графика, конечно, так себе. Но вроде функционал готов.

Легендочка:

синий - это рут обжект (по задумке какая-то отправная точка, но ничто не мешает заменить на обычный скилл)

зелёный - активный скилл

красный - пассивный скилл, зависящий от этого скила.

Вся эта штука спокойно масштабируется в любое количество шагов.

Челенж по выполнению заданий от пикабушников №1 Gamedev, C-shapr, Generator, Unity, Гифка, Длиннопост
Челенж по выполнению заданий от пикабушников №1 Gamedev, C-shapr, Generator, Unity, Гифка, Длиннопост
Челенж по выполнению заданий от пикабушников №1 Gamedev, C-shapr, Generator, Unity, Гифка, Длиннопост

Есть ещё некоторые косметические недоделки: начальная точка расположения всегда справа, но для этого можно добавить рандомизатор, что разнообразит рисунок дерева в целом; нет графики; ничего не юзабельно, само собой :D

Управляется всё это дело вот такой вот штукой:

Челенж по выполнению заданий от пикабушников №1 Gamedev, C-shapr, Generator, Unity, Гифка, Длиннопост

Префабы рут объекта (центрального), главного скила + его цвет, пассивного скила + его цвет, связи + цвет

MaxBranches - это вектор 2, минимальное кол-во веток из узла и максимальное количество веток (Random.Range выбирает из этого диапазона для каждого узла)

SkillDistance - расстояние от одного скила до другого (это флоат, в юнитёвских единицах)

TreeSteps - кол-во шагов в каждой ветке (если макс брэнч выпадет 0 - ветка прервётся)

MaxPassiveSkill - это вектор 2, минимально кол-во пассивных скилов (красных квадратиков) и максимальное.

SubSkillDistance - расстояние от центра активного скила (зеленого), до центра пассивного (красного).


Код получился длинным, аж на 130 строк, но основной кусок здесь

Челенж по выполнению заданий от пикабушников №1 Gamedev, C-shapr, Generator, Unity, Гифка, Длиннопост

Есть ещё косяк с хранением всего этого дела. А именно: я передаю инфу через пару листов, для пошаговой генерации. И голова уже не варит, как это организовать правильнее :D

Челенж по выполнению заданий от пикабушников №1 Gamedev, C-shapr, Generator, Unity, Гифка, Длиннопост

Графически, конечно, не очень впечатляет, но в целом работает. Дерево генерится, всё хорошо. Кроме времени генерации ) Большие на 10+ шагов деревья просаживают фпс до 15 ^_^

Челенж по выполнению заданий от пикабушников №1 Gamedev, C-shapr, Generator, Unity, Гифка, Длиннопост

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

Показать полностью 7

Шейдер отражений

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

Шейдер отражений Gms2, VFX, Компьютерная графика, Gamedev, Гифка, Длиннопост

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

Шейдер отражений Gms2, VFX, Компьютерная графика, Gamedev, Гифка, Длиннопост

Дальше будет многабукф из кода. А то мало ли фотошоп...

Шейдер отражений Gms2, VFX, Компьютерная графика, Gamedev, Гифка, Длиннопост

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

Ну и зачем это всё:

Надеюсь на помощь лиги. Решил устроить самочеленж. Все желающие могут писать в комментах какое-то задание, связанное с игростроем, а я постараюсь его выполнить. Себе для скиллапа, публике на потеху. (Кроме, пожалуй, музыки... музыку я не умею)

Показать полностью 2

Не хотят принимать ребёнка в детский сад

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

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

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

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

Погнали!

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

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

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

Я не претендую на труЪ истину, я просто опишу задачу и вариант решения, который пришел в голову мне.

Итак имеем:

-яркий протяженный объект, который меняет свою внутреннюю структуру

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

vertex_format_begin();
vertex_format_add_position();
vertex_format_add_colour();
vertex_format_add_textcoord();
v_format = vertex_format_end();
v_buff = vertex_create_buffer();
vertex_begin(v_buff, v_format);

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

функция отрисовки выглядит так:

vertex_submit(buff, pr_trianglelist, sprite_get_texture(sprite_index));

тут юзер сам решает что (buff), каким макаром (pr_trianglelist) и с использованием чего (prite_index) отрисовывать. Т.е. берётся массив точек из buff, и по типу построения pr_trianglelist(разрозненные треугольники) отрисовывается.

В нашей задаче молния непрерывна, поэтому функция отрисовки идет через pr_trianglestrip.

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

чтобы сформировать саму загогулину, приходится мотать вертекс буфер по циклу, в каждой итерации прибавляя к текущему положению с помощью lengthdir_x/lengthdir_y значения для точек следующего шага. Честно говоря, тут я жоско втупил и полез даже на форум спрашивать совета, однако первый же ответ спровоцировал меня перепроверить свои вычисления и я нашел ошибку со знаками. Зря людей тревожил.

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

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

в принципе, на этом хитрости заканчиваются(нет). И можно получить "молнию", распространяющуюся из точки в направлении на определённую дистанцию.

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

Но что делать с монохромным зигзагом? Тут как раз пригодятся шейдеры. Совсем простой frag-шейдер. Вертексный тут нам вообще не нужно трогать.

varying vec2 v_vTexcoord;
uniform float cur_alpha;
uniform float col_r;
uniform float col_g;
uniform float col_b;
void main()
{
vec4 col = vec4 (col_r,col_g,col_b,0.0);
col.r *= (1.0-(abs((v_vTexcoord.x-0.5)*2.0)));
col.g *= (1.0-(abs((v_vTexcoord.x-0.5)*2.0)));
col.b *= (1.0-(abs((v_vTexcoord.x-0.5)*2.0)));
gl_FragColor = col;
gl_FragColor.a = (1.0-sqrt(abs(v_vTexcoord.x-0.5)*2.0)) * cur_alpha;
}

Он просто принимает из объекта(функции, откуда укажит пользователь) значения для цветов по ргб каналам, значение для корректировки альфы и всё это обсчитывает, основываясь на значениях текстурных координат. Тут надо пояснить, что текстурные координаты берутся из точки и я при формировании сам устанавливаю их для левых 0, для правых 1 (ну или наоборот, кто их знает). А в шейдере получаю градиент от границы объекта к центру. Градиент для цвета линейный. Градиент для шейдера - через квадратный корень. Кому интересно разница вот в чем:

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

т.е. для корня в моём случае будет "острее" серединка, т.е. место где прозрачности не будет, потом резкий спад и плавное затухание. Этакая аура вокруг центральной части. Модификатор cur_alpha я тут использовал для реализации мерцания всей молнии... чтобы она просто не выглядела статичной, а "жила", как любят говорить всякие художники...

Шейдер вызывается из объекта. Вот функция отрисовки конечного результата:

shader_set(shader_lightning)

//color settings to shader

shader_col_r = shader_get_uniform(shader_lightning, "col_r");

shader_col_b = shader_get_uniform(shader_lightning, "col_b");

shader_col_g = shader_get_uniform(shader_lightning, "col_g");

shader_set_uniform_f(shader_col_r,0.6)

shader_set_uniform_f(shader_col_g,0.6)

shader_set_uniform_f(shader_col_b,2)

//alpha settings to shader

shader_alpha = shader_get_uniform(shader_lightning, "cur_alpha");

shader_set_uniform_f(shader_alpha,random_range(0.8,1.2))

for (var i=0;i < ds_list_size(vb);i++)

{

cvb = ds_list_find_value(vb,i)

//draw call

vertex_submit(cvb,pr_trianglestrip,sprite_get_texture(sprite1,0))

//draw call to moar HOT effect

gpu_set_blendmode(bm_add)

vertex_submit(cvb,pr_trianglestrip,sprite_get_texture(sprite1,0))

gpu_set_blendmode(bm_normal)

}

shader_reset()

Что здесь происходит:

цикл прокатывается по всему массиву (vb, в моём случае). И отрисовывает все вертекс буферы, которые в нём лежат (а в него приходится складывать по частям кажду "веточку", потому что если их сцепить в один массив - то между концами потянуться перемычки, которые нам не нужны). Шейдер устанавливается на нужный, в него впихиваются все переменные (только сперва их нужно вызвать), устанавливается по вкусу. Внимательный зритель уже заметил, что в col_b стоит 2, что как бы вызывает сомнения в адекватности автора... на первый взгляд. Но, на самом деле, нет. Этот параметр реально будет работать за пределами единицы, ввиду того, что у нас для расчёта цвета стоит формула с линейным затуханием. Дальше сама отрисовка и тут приходится костылить. Можно закостылить в шейдере, по идее, но мне лень, так как есть более простой способ. Устанавливаем gpu_set_blendmode(bm_add) (режим смешивания для видеокарты) и отрисовывает этот же примитив поверх предыдущего. Add - смешивает цвета вашего объекта с цветами фона под ним. Поэтому нельзя просто так взять и... нужна подложка, без неё всё будет не так красочно.

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

Ну и "на фоне" (рандомный картинка из интернетофф)

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

ну и куда же без оружия. LightningGun в студию:

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

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

lightning_direction = (prev_lightning_dir+point_direction(start_pos_x,start_pos_y,end_pos_x,end_pos_y))/2+random_range((i-steps),(abs(i-steps)))

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

З.ы. вопросы в комменты, ссылка на проект, для личного ковыряния: https://yadi.sk/d/HtxPPn8R3R29uU

Показать полностью 9

Базовые 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, Гифка, Длиннопост
Показать полностью 7

Базовые FX на GMS2

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

Базовые FX на GMS2 Gms2, Gamemaker Studio 2, VFX, Gamedev, Гифка, Длиннопост
Базовые FX на GMS2 Gms2, Gamemaker Studio 2, VFX, Gamedev, Гифка, Длиннопост
Базовые FX на GMS2 Gms2, Gamemaker Studio 2, VFX, Gamedev, Гифка, Длиннопост
Базовые FX на GMS2 Gms2, Gamemaker Studio 2, VFX, Gamedev, Гифка, Длиннопост
Базовые FX на GMS2 Gms2, Gamemaker Studio 2, VFX, Gamedev, Гифка, Длиннопост
Базовые FX на GMS2 Gms2, Gamemaker Studio 2, VFX, Gamedev, Гифка, Длиннопост

И небольшой тутор для самых юных с парой фишек:

Базовые FX на GMS2 Gms2, Gamemaker Studio 2, VFX, Gamedev, Гифка, Длиннопост

это коТ системы частиц. Параметры эммитера, которые задействованы - область применения и принцип рождения. Тут конкретно - разово рождается 12 штук частиц по имени flame_part.

Сама система должна быть создана (первая строчка), иначе чуда не будет.

Самое интересное, конечно же, настройки частиц. По порядку:

- shape - картинка, которая будет использоваться как частица

- color_rgb - цвет партиклов в ргб диапазоне... ни добавить, ни отнять.

- life - время жизни

- apha3 - какой-то местный кастрат альфа/пер тайм. Т.е. отрезок жизни частицы делится на трое и катает альфу от первого ко второму, а затем к третьему значению. (У меня 0.0 и 0 оба варианта допустимы, но через точку писать не стоит, конечно же, дабы не захламлять, не пишите так)

- size - размер частицы

- speed - скорость

- direction - направление, по которому будет применяться параметр скорости

- blend - режим смешивания аддитив (может быть включен и нет)

- orientation - поворот частицы во время жизни.

Настройки есть ещё, но общий принцип работы всё равно для всех примерно один.

И фишечки: если хочется создать эффект, который будет выглядеть "натурально" - надо вносить хаос. Это основной принцип. Чем больше непохожесть партиклов тем больше деталей будет в эффекте.

Например:

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

Альфа - так или иначе все частицы рождаются в какой-то момент и в какой-то исчезают. Чем плавнее частицы переходят в ноль - тем более незаметно это исчезновение. Поэтому на какие-то плавные эффекты, типа взрывов, огня - альфа должна уходить в ноль. Не стоит недооценивать третью точку в альфа3. Эффект, альфа3(1,1,0) - будет дольше виден, чем альфа2(1,0) и наоборот. А если ваш эффект рождается из точки - то альфа3(0,1,0) - как раз то, что нужно.

Размер - практически 90% случаев - частицы будут разных размеров, более того, во всех естественных эффектах (ну кроме молнии), эволюция частиц связана с размерами. Тот же огонь, например, если превращается в дым, то размер частиц растёт, а скорость падает. Если в дым частицы не эволюционируют - то размер наоборот сходит на нет. Поэтому не скупитесь на хаос в размерах, а так же не забывайте про их эволюции.

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

Поворот - поворот добавит естественности, но может и наоборот сделать всё говном. Крайне важно не переборщить, иногда для хорошего эффекта хватает пол градуса в секунду, а иногда и бешенное вращение будет збс!

И ещё пару слов про параметры. Почти во всех параметрах частицы есть значение эволюции (incr) и хаотичности (wiggle). Эволюция более менее понятна - чем больше плюс - тем быстрее приращение, в минус - тоже, но с обратным знаком. А вот wiggle - вещь более специальная и не везде подойдёт. Например для реактивной струи огнемёта нелохо завиглить размер - это придаст потоку хаотичной турбулетности (на самом деле нет, но выглядеть будет похоже). Или вам нужны взлетающие мыльные пузыри (тут виглом можно создать эффект лопающихся, во время подъема шариков). А в скорости, например, wiggle позволит создать эффект пробегающих по скоплению эффекта огоньков. Применений полно, всё не перечислить. Главное общая концепция - чем больше хаоса - тем вероятнее вигл надо использовать.

Ну и не расчитывайте "сесть и сделать". Более менее внятные картинки получаются всегда раза с 50ого. Настроил, посмотрел... посмотрел и настроил... Главное, во время отладки, не менять все параметры враз, а вычленять какие-то конкретные и подправлять их, потом брать следующий, и т.д. и т.п.

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

З.ы. конкретные листинги выкладывать не буду, чтоб не захламлять, если кому надо - обращайтесь в комментах.

Показать полностью 6

Респект админам сообщества!

Уже, наверное, все в курсе персонажа @flatingo, который тут регулярно светился своими поделками. Кто не в курсе, вкратце: это странный школьник с унылым голосом, который нагло пиздит из интернетов чужой контент и размещает от своего имени, пиарится на всех площадках, куда додумывается залезть, при этом производит унылое говно, а иногда и откровенно бредовые высеры. И вот свершилось

Респект админам сообщества! Тег, Но его забанили все уже, Правосудие, Победа сил разума

З.ы. пост исключительно для поделится новостью и во славу админам лиги.

#comment_100822916

Отличная работа, все прочитано!