О чем этот пример
Создание статичного потока частиц — это лишь первый шаг. Настоящая магия начинается, когда мы оживляем сам источник. В этом примере показано, как использовать систему твинов Phaser для анимации свойства `speedY` эмиттера частиц. Этот приём позволяет легко создавать сложные, динамичные эффекты, такие как пульсирующие струи, дыхание магических порталов или ритмичные выбросы энергии, без необходимости вручную управлять каждым кадром.
Версия 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('bg', 'assets/tweens/sky.png');
this.load.atlas('match3', 'assets/atlas/match3.png', 'assets/atlas/match3.json');
}
create ()
{
this.add.image(400, 300, 'bg');
const emitter = this.add.particles(100, 300, 'match3', {
frame: 'Match3_Icon_01',
speedY: 200,
lifespan: 2000,
alpha: { start: 1, end: 0 },
gravityX: 400,
scale: 0.5
});
this.tweens.add({
targets: emitter,
speedY: -100,
duration: 500,
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);
Подготовка сцены и ассетов
В методе preload мы загружаем два ресурса: фоновое изображение и атлас спрайтов. Атлас match3 будет использоваться как текстура для наших частиц.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('bg', 'assets/tweens/sky.png');
this.load.atlas('match3', 'assets/atlas/match3.png', 'assets/atlas/match3.json');
}
Создание эмиттера частиц
В методе `create` сначала добавляется фоновое изображение. Затем создаётся эмиттер частиц с помощью `this.add.particles()`. Ключевые параметры настройки:
- `speedY: 200` — начальная вертикальная скорость частиц (вниз).
- `lifespan: 2000` — время жизни частицы в миллисекундах.
- `alpha: { start: 1, end: 0 }` — частицы плавно исчезают.
- `gravityX: 400` — сильное горизонтальное притяжение, увлекающее частицы вправо.
- `scale: 0.5` — масштаб частиц.
const emitter = this.add.particles(100, 300, 'match3', {
frame: 'Match3_Icon_01',
speedY: 200,
lifespan: 2000,
alpha: { start: 1, end: 0 },
gravityX: 400,
scale: 0.5
});
Анимация свойства эмиттера через Tween
Здесь происходит самое интересное. Мы создаём твин, который будет анимировать не графический объект, а сам эмиттер, а точнее — его свойство speedY. Твин настроен на бесконечное повторение с эффектом йо-йо.
- targets: emitter — указываем, что анимируем объект emitter.
- speedY: -100 — целевое значение скорости. Частицы начнут лететь вверх.
- yoyo: true — после достижения цели твин проиграется в обратном порядке.
- repeat: -1 — бесконечное повторение.
Таким образом, вертикальная скорость частиц будет плавно колебаться между 200 (вниз) и -100 (вверх), создавая эффект пульсации или дыхания всего потока.
this.tweens.add({
targets: emitter,
speedY: -100,
duration: 500,
ease: 'sine.inout',
yoyo: true,
repeat: -1
});
Конфигурация и запуск игры
Стандартная конфигурация игры Phaser, задающая размеры холста, цвет фона и указывающая класс основной сцены.
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Что попробовать дальше
Твины в Phaser — мощный инструмент для анимации не только позиций или альфа-каналов, но и любых числовых свойств ваших игровых объектов, включая параметры эмиттеров частиц. Для экспериментов попробуйте анимировать другие свойства, такие как frequency, gravityX/gravityY, или angle. Комбинируя несколько твинов на одном эмиттере, можно создавать невероятно сложные и живые визуальные эффекты для магии, техники или природных явлений в вашей игре.
