О чем этот пример
Динамические визуальные эффекты — ключ к созданию атмосферы в игре. Часто стандартного набора опций эмиттера недостаточно, чтобы добиться нужного разнообразия. В этой статье мы разберем, как создать частицы, каждая из которых получает случайный цвет из заранее подготовленной палитры, используя встроенные возможности Phaser для работы с цветом и массив `tint`. Этот прием оживит взрывы, магические заклинания или фоновые эффекты, добавив им красочности без использования лишних текстур.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('brush', 'assets/sprites/brush1.png');
}
create ()
{
const hsv = Phaser.Display.Color.HSVColorWheel();
const tint = hsv.map(entry => entry.color);
const emitter = this.add.particles(400, 100, 'brush', {
speedX: 200,
lifespan: 2000,
tint
});
this.tweens.add({
targets: emitter,
particleY: 400,
speedX: -200,
duration: 1500,
ease: 'sine.inout',
yoyo: true,
repeat: -1
});
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Подготовка палитры: цветовой круг HSV
Перед созданием эмиттера необходимо сгенерировать палитру цветов. Phaser предоставляет удобную статическую функцию Phaser.Display.Color.HSVColorWheel(), которая возвращает массив из 360 объектов. Каждый объект соответствует одному градусу цветового круга в модели HSV (Hue, Saturation, Value) и содержит числовое представление цвета в формате RGB.
const hsv = Phaser.Display.Color.HSVColorWheel();
Полученный массив hsv содержит объекты со свойствами color (число) и `h` (оттенок). Для передачи в эмиттер нам нужен именно массив числовых значений цвета.
const tint = hsv.map(entry => entry.color);
Метод .map() проходит по всему массиву hsv и создает новый массив tint, состоящий только из значений entry.color. Теперь у нас есть массив из 360 различных цветов, готовый к использованию.
Создание и настройка эмиттера частиц
Эмиттер создается с помощью метода this.add.particles(). Ключевой параметр для рандомизации цвета — это tint. Если передать в него массив (как наш tint), Phaser будет случайным образом выбирать значение из этого массива для каждой новой создаваемой частицы.
const emitter = this.add.particles(400, 100, 'brush', {
speedX: 200,
lifespan: 2000,
tint // Сокращенная запись от tint: tint
});
Здесь:
- 400, 100 — начальные координаты эмиттера.
- 'brush' — ключ текстуры частицы (простая кисть).
- speedX: 200 — начальная горизонтальная скорость частиц.
- lifespan: 2000 — время жизни частицы в миллисекундах (2 секунды).
- tint — массив цветов. Каждая частица при рождении получит случайный цвет из этого массива.
Анимация эмиттера с помощью твинов
Чтобы эффект не был статичным, добавим анимацию самому эмиттеру с помощью системы твинов this.tweens.add(). Мы заставим эмиттер двигаться вверх-вниз и менять направление разлета частиц.
this.tweens.add({
targets: emitter,
particleY: 400,
speedX: -200,
duration: 1500,
ease: 'sine.inout',
yoyo: true,
repeat: -1
});
Этот твин анимирует свойства самого объекта emitter:
- targets: emitter — объект для анимации.
- particleY: 400 — конечное значение вертикальной координаты для новых частиц.
- speedX: -200 — конечное значение горизонтальной скорости (частицы полетят влево).
- duration: 1500 — длительность одного цикла анимации.
- ease: 'sine.inout' — плавная синусоидальная функция easing.
- yoyo: true — после завершения анимация пойдет в обратном порядке.
- repeat: -1 — бесконечное повторение.
В результате эмиттер будет плавно "раскачиваться", создавая разноцветный фонтан частиц, меняющий направление.
Что попробовать дальше
Использование массива в свойстве tint — простой и мощный способ добавить цветовое разнообразие частицам. Вы можете экспериментировать: создавать палитру не из всего цветового круга, а только из теплых или холодных оттенков, менять массив tint динамически в зависимости от игровых событий или комбинировать этот подход с другими параметрами частиц, такими как scale или alpha, для создания сложных эффектов вроде северного сияния или разноцветного дыма.
