О чем этот пример
Создание плавных и визуально привлекательных эффектов — ключ к захватывающему геймплею. В этой статье мы разберем, как система частиц Phaser позволяет легко анимировать их положение и вращение по заданным траекториям с помощью функций плавности (easing). Вы научитесь управлять параметрами `start`, `end` и `ease` эмиттера частиц, чтобы создавать сложные анимации, такие как заезд машин по трассе, без написания кадр за кадром.
Версия 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('track', 'assets/particles/racetrack-bend.png');
this.load.image('car', 'assets/sprites/car-red.png');
}
create ()
{
this.add.image(450, 300, 'track').setScale(0.8);
this.add.particles(0, 0, 'car', {
x: { start: 200, end: 850, ease: 'sine.in' },
y: { start: 600, end: 100, ease: 'sine.out' },
rotate: { start: 0, end: 90, ease: 'quad.in' },
lifespan: 2200,
frequency: 550
});
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#0c5e03',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Подготовка сцены и загрузка ассетов
Первым делом в методе preload() мы загружаем два изображения, которые будут использоваться в примере. Одно для фона (трассы), другое — для спрайта, который станет нашей частицей (машины). Обратите внимание, что базовый URL задается для удобства, чтобы указывать относительные пути.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('track', 'assets/particles/racetrack-bend.png');
this.load.image('car', 'assets/sprites/car-red.png');
}
Создание фона и эмиттера частиц
В методе create() мы сначала добавляем фоновое изображение трассы, немного уменьшив его масштаб с помощью .setScale(0.8) для лучшего размещения в окне игры.
Затем создается сам эмиттер частиц с помощью метода this.add.particles(). Первые два аргумента (0, 0) — это глобальные координаты эмиттера. Однако ключевая магия происходит в конфигурационном объекте, где мы определяем поведение каждой испускаемой частицы, используя спрайт 'car'.
create ()
{
this.add.image(450, 300, 'track').setScale(0.8);
this.add.particles(0, 0, 'car', {
// Конфигурация анимации частиц
});
}
Анимация свойств: от точки А к точке Б с плавностью
Сердце примера — конфигурация эмиттера. Вместо статичных значений мы передаем объекты для свойств `x,yиrotate. Каждый такой объект содержит три ключа:start(начальное значение),end(конечное значение) иease` (функция плавности перехода).
Частица (машина) будет рождаться со значениями start для каждого свойства и за время своей жизни (lifespan) плавно изменять их до значений end, следуя кривой, заданной ease.
{
x: { start: 200, end: 850, ease: 'sine.in' },
y: { start: 600, end: 100, ease: 'sine.out' },
rotate: { start: 0, end: 90, ease: 'quad.in' },
lifespan: 2200,
frequency: 550
}
- **x, y**: Определяют траекторию движения. Машина начинает в точке (200, 600) и заканчивает в (850, 100), двигаясь по диагонали вверх и вправо. - **rotate**: Задает вращение. Машина поворачивается от 0 до 90 градусов за время жизни. - **lifespan**: Время жизни частицы в миллисекундах (2200 мс = 2.2 сек). - **frequency**: Интервал между испусканием частиц в миллисекундах (новая машина каждые 550 мс).
Выбор функций плавности (Easing)
Параметр ease — это мощный инструмент, контролирующий скорость изменения анимации. Phaser использует имена из библиотеки Tween. В нашем примере:
- 'sine.in' для оси X: движение начинается медленно и ускоряется к концу.
- 'sine.out' для оси Y: движение начинается быстро и замедляется к финишу.
- 'quad.in' для вращения: поворот начинается очень медленно, затем резко ускоряется.
Использование разных функций для разных свойств создает более естественное и "оживленное" движение, имитирующее разгон, торможение и вхождение в поворот.
Конфигурация игры и запуск
Код завершается стандартной конфигурацией игры Phaser, где задаются размеры холста, цвет фона, элемент-родитель в HTML и класс сцены, который мы описали.
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#0c5e03',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
После создания экземпляра Phaser.Game сцена автоматически запускает свои методы preload, create, и начинается визуальный эффект.
Что попробовать дальше
Система частиц Phaser с поддержкой анимации через start, end и ease — это простой, но невероятно выразительный инструмент. Вы можете анимировать не только положение и вращение, но и масштаб, прозрачность (alpha) и даже оттенок (tint). Поэкспериментируйте: попробуйте разные функции плавности ('back', 'bounce', 'elastic'), создайте эмиттер, где частицы разлетаются из центра по спирали, или сымитируйте падающие листья с хаотичным вращением и замедлением внизу экрана.
