Эффекты частиц

WME предоставляет стандартные генераторы частиц (particle emitters) для создания эффектов в реальном времени, таких как снег, дождь или дым. Эффекты создаются путём задания различных параметров. Комбинируя эти параметры Вы можете добиться самых разнообразных эффектов.

Проект WME particles demo

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

Этот проект находится в установочной директории WME, в подпапке projects\wme_particles.


Создание генератора частиц

В WME каждый генератор прикрепляется либо к объекту сцены, либо к персонажу. Это позволяет Вам точно задать глубину размещения частиц внутри сцены. Объекты и персонажи обладают методом CreateParticleEmitter(), который инициализирует генератор частиц, прикреплённый к объекту. Вы можете обращаться к инициализированному генератору с помощью свойства ParticleEmitter объекта, к которому он прикреплён.

// запрашиваем объект сцены, к которому мы прикрепим генератор частиц
var SomeEntity = Scene.GetNode("some_entity");

// инициализируем генератор
SomeEntity.CreateParticleEmitter();

// запрашиваем его
var Emit = SomeEntity.ParticleEmitter;

За полным списком свойств и методов генератора частиц обращайтесь к разделу Программирование. Генератор частиц.

Уничтожение генератора частиц

Если генератор более не требуется, Вы можете удалить его из памяти с помощью метода DeleteParticleEmitter() объекта сцены или персонажа.

Параметры генератора частиц

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

Размеры генератора

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

Emit.X = 100;
Emit.Y = 100;
Emit.Width = 200;
Emit.Height = 200;

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

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

Границы

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

Emit.SetBorder(0, 0, Scene.Width, Scene.Height);

Также бывает полезным указать толщину границ. Например, Вам нужно, чтобы "земля" имела какую-то высоту. Для указания толщины границ используйте метод SetBorderThickness(). В следующем примере задаётся толщина нижней границы в 100 пикселей:

Emit.SetBorderThickness(0, 0, 0, 100);

Визуальное представление

Частицы представляются спрайтами WME. Вы можете назначить один и более спрайтов генератору частиц с помощью метода AddSprite(). Когда генератор создаёт новую частицу, он присваивает ей случайным образом один из заданных спрайтов. Т.е. как минимум один спрайт обязательно должен быть задан. Для удаления спрайтов из списка воспользуйтесь методом RemoveSprite().

Масштаб, скорость и направление

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

Emit.Velocity1 = 20;
Emit.Velocity2 = 50;

Emit.Scale1 = 10;
Emit.Scale2 = 100;

Emit.Angle1 = 175;
Emit.Angle2 = 185;

В приведённом примере скорость лежит в диапазоне от 20 до 50, масштаб - от 10 до 100 (процентов), угол направления - от 175 до 185 (градусов). 0 градусов - вверх, 90 - вправо, 180 - вниз, 270 - влево.

Время жизни и прозрачность

Время жизни влияет на то, как долго частица существует на экране до тех пор, пока не исчезнет. Если эта величина меньше или равна 0, то время жизни не будет ограничено. В этом случае частицы будут исчезать только при соприкосновении с границей. Эта величина также задаётся диапазоном (в мс), подобно другим случайным параметрам.

Emit.LifeTime1 = 4000;
Emit.LifeTime2 = 5000;

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

Emit.Alpha1 = 255;
Emit.Alpha2 = 0;
Emit.AlphaTimeBased = true;

В приведённом примере прозрачность будет плавно меняться со значения 255 (полностью непрозрачный) до 0 (абсолютно невидимый).

Если атрибут AlphaTimeBased не установить в true, то частицы будут использовать прозрачность, выбранную случайным образом из диапазона Alpha1 - Alpha2.

Глубина

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

Emit.LifeTimeZBased = true;
Emit.VelocityZBased = true;
Emit.ScaleZBased = true;

Вращение

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

Emit.Rotation1 = 0;
Emit.Rotation2 = 360;
Emit.AngVelocity1 = 1000;
Emit.AngVelocity2 = 2000;

Рост/сжатие

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

Emit.GrowthRate1 = 20;
Emit.GrowthRate2 = 50;
Emit.ExponentialGrowth = true;

Генерация частиц

Частицы генерируются группами. Следующие параметры задают временной интервал и размер группы генерируемых частиц:

Emit.GenerationInterval = 200;
Emit.GenerationAmount = 40;

В этом примере генератор каждые 200 мс будет создавать 40 новых частиц. Генератор повторно использует "умершие" частицы и создаёт новые, если нет доступных для повторного использования. Вы можете задать максимально допустимое количество видимых частиц на экране с помощью свойства MaxParticles:

Emit.MaxParticles = 300;

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

Вы можете узнать количество активных частиц на текущий момент с помощью свойства NumLiveParticles.

Затухание/усиление чёткости

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

Emit.FadeOutTime = 1000; //время затухания в мс

Маскирование частиц по региону

Иногда требуется отображать только те частицы, которые находятся внутри определённой области на экране. Вы можете достичь этого эффекта, установив атрибут UseRegion в true. Это сработает только в том случае, если генератор частиц принадлежит региону (region entity). Тогда этот регион будет отвечать за видимость частиц.

Emit.UseRegion = true;

Выполнение сценариев

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

Emit.EmitEvent = "burst";

...

on "burst"
{
  this.PlaySound("sounds\burst.ogg");
}

Управление генератором частиц

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

Для остановки, паузы и продолжения работы генератора существуют методы Stop(), Pause() и Resume().

Источники воздействия

В дополнение к собственным скорости и направлению частиц Вы можете влиять на их движение с помощью добавления на сцену источников воздействия. Например, Вы хотите изобразить дуновение ветра. Существует два типа источников: глобальные (global force) и точечные (point force). Глобальные источники влияют на все частицы одинаковым образом, в то время как точечные сильнее воздействуют на те частицы, которые к ним ближе. Каждый источник определяется своим именем, направлением, силой и позицией (для точечных источников). Для добавления или замены источников воздействия с тем же именем используются методы AddGlobalForce() и AddPointForce(). Для удаления воспользуйтесь методом RemoveForce() .