О чем этот пример
В игровом движке Phaser 3 реализация сложных траекторий движения объектов и визуальных эффектов может быть простой и элегантной. Эта статья разбирает пример сцены, где космический корабль следует по заранее заданному сплайну, оставляя за собой красивый шлейф из частиц. Вы узнаете, как создавать плавные, повторяющиеся пути для игровых объектов и привязывать к ним динамические системы частиц для усиления визуального восприятия.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class SceneE extends Phaser.Scene {
constructor ()
{
super('SceneE');
this.ship;
this.particles;
this.emitter;
this.splineData = [
50, 300,
146, 187,
35, 94,
180, 40,
446, 35,
438, 100,
337, 150,
452, 185,
560, 155,
641, 90,
723, 147,
755, 262,
651, 271,
559, 318,
620, 384,
563, 469,
433, 457,
385, 395,
448, 334,
406, 265,
316, 305,
268, 403,
140, 397,
205, 309,
204, 240,
144, 297,
50, 300
];
this.curve;
}
create ()
{
this.cameras.main.setViewport(0, 136, 1024, 465);
this.curve = new Phaser.Curves.Spline(this.splineData);
let ship = this.add.follower(this.curve, 50, 300, 'space', 'ship');
ship.startFollow({
duration: 12000,
yoyo: true,
ease: 'Sine.easeInOut',
repeat: -1
});
this.particles = this.add.particles(0, 0, 'space', {
frame: 'blue',
speed: 100,
lifespan: 2000,
alpha: 0.6,
angle: 180,
scale: { start: 0.7, end: 0 },
blendMode: 'ADD'
});
ship.setDepth(1);
this.ship = ship;
this.particles.startFollow(this.ship);
}
}
Подготовка данных и инициализация сцены
В конструкторе класса сцены SceneE мы определяем ключевые свойства и данные для построения кривой. Массив splineData содержит координаты X и Y контрольных точек, по которым будет построен сплайн. Каждая пара чисел представляет собой позицию на экране. Это основа для траектории движения.
this.splineData = [
50, 300,
146, 187,
// ... остальные координаты
50, 300
];
Также в конструкторе объявляются переменные для хранения ссылок на игровой объект корабля (this.ship), систему частиц (this.particles) и саму кривую (this.curve). Метод super('SceneE') регистрирует сцену в менеджере сцен движка под уникальным ключом 'SceneE'.
Создание кривой и объекта-последователя
В методе create() сначала задается область просмотра для камеры сцены с помощью this.cameras.main.setViewport. Затем на основе подготовленного массива точек создается объект сплайна — плавной кривой, проходящей через эти точки.
this.curve = new Phaser.Curves.Spline(this.splineData);
Следующий шаг — создание игрового объекта, который будет следовать по этой кривой. Для этого используется фабричный метод this.add.follower. Первым аргументом передается созданная кривая, следующими — стартовые координаты (они будут проигнорированы, так как объект встанет на начало кривой) и ключи для текстуры и кадра.
let ship = this.add.follower(this.curve, 50, 300, 'space', 'ship');
После создания объекта на него сразу вызывается метод startFollow, который запускает анимацию движения. В конфигурационном объекте задаются параметры: длительность одного прохода по кривой, флаг возврата обратно (yoyo), функция плавности и количество повторений (-1 для бесконечного).
ship.startFollow({
duration: 12000,
yoyo: true,
ease: 'Sine.easeInOut',
repeat: -1
});
Настройка и привязка системы частиц
Чтобы создать визуальный эффект шлейфа, используется система частиц. Она создается методом this.add.particles. Первые два аргумента — это изначальные координаты эмиттера (0, 0), но они не важны, так как эмиттер будет следовать за кораблем. Далее указывается ключ атласа текстур и конфигурация частиц.
this.particles = this.add.particles(0, 0, 'space', {
frame: 'blue', // Кадр текстуры для частиц
speed: 100, // Скорость разлета частиц
lifespan: 2000, // Время жизни частицы в миллисекундах
alpha: 0.6, // Прозрачность
angle: 180, // Направление эмиссии (вверх)
scale: { start: 0.7, end: 0 }, // Изменение размера от начала к концу жизни
blendMode: 'ADD' // Режим наложения для эффекта свечения
});
Чтобы частицы появлялись позади движущегося объекта, кораблю принудительно задается большая глубина отрисовки с помощью ship.setDepth(1). Это гарантирует, что он будет поверх частиц.
Финальный и ключевой шаг — заставить систему частиц следовать за кораблем. Это делает метод startFollow, вызванный у системы частиц.
this.particles.startFollow(this.ship);
Теперь эмиттер частиц будет постоянно находиться в той же позиции, что и спрайт корабля, создавая реалистичный эффект двигательного следа.
Практические советы по адаптации
Этот паттерн можно использовать для множества игровых элементов: траектории вражеских самолетов, движения платформ или пути, по которому игрок должен провести мяч.
* **Изменение пути:** Отредактируйте массив splineData. Вы можете визуализировать кривую для отладки, добавив ее отрисовку в сцену: this.curve.draw(graphics), где graphics — объект this.add.graphics().
* **Настройка движения:** Поэкспериментируйте с параметрами в startFollow. Уменьшите duration для более быстрого движения, измените ease на 'Linear' для постоянной скорости или уберите yoyo, чтобы движение шло только в одну сторону с мгновенным возвратом в начало.
* **Визуальные эффекты:** Попробуйте изменить параметры частиц. Например, angle: 90 создаст шлейф влево, а изменение blendMode на 'NORMAL' уберет эффект наложения. Можно создать несколько систем частиц с разными текстурами и привязать их к одному объекту для сложных эффектов.
Что попробовать дальше
Использование Curves.Spline и Follower в связке с системой частиц — мощный и лаконичный способ добавить в игру сложную анимацию движения и качественные визуальные эффекты. Для экспериментов попробуйте заставить частицы реагировать на скорость объекта (например, менять их количество) или создайте несколько независимых объектов, движущихся по одной и той же кривой с разной скоростью.
