О чем этот пример
Создание плавного и синхронизированного движения множества объектов — ключевая задача в аркадных и стратегических играх. Вместо того чтобы вручную прописывать координаты для каждого спрайта, Phaser предлагает мощный и элегантный инструмент — систему путей (Paths) и последователей (Followers). Эта статья покажет, как загрузить путь из JSON-файла и заставить целый отряд кораблей следовать по нему с задержкой, создавая эффект организованной эскадры.
Версия 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.json('waves', 'assets/paths/waves.json');
this.load.image('ship', 'assets/sprites/bsquadron1.png');
}
create ()
{
const path = new Phaser.Curves.Path(this.cache.json.get('waves'));
const graphics = this.add.graphics().lineStyle(1, 0x2d2d2d, 1);
path.draw(graphics);
for (let i = 0; i < 20; i++)
{
const follower = this.add.follower(path, 0, 0, 'ship');
follower.startFollow({
duration: 5000,
positionOnPath: true,
repeat: -1,
ease: 'Linear',
delay: i * 70
});
}
}
}
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Загрузка данных: путь как ресурс
В Phaser путь можно не только создавать программно, но и загружать как внешний ресурс — например, из JSON-файла. Это особенно удобно для сложных траекторий, созданных в редакторах.
В методе preload мы используем this.load.json для загрузки файла с описанием пути. Он сохраняется в кэше под ключом 'waves'. Одновременно загружается изображение спрайта корабля.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.json('waves', 'assets/paths/waves.json');
this.load.image('ship', 'assets/sprites/bsquadron1.png');
}
Создание и отрисовка пути
В методе create мы извлекаем данные пути из кэша и создаем объект Phaser.Curves.Path. Этот объект инкапсулирует всю информацию о кривой.
Затем, для наглядности отладки, мы создаем объект graphics и рисуем на нем наш путь с помощью метода path.draw(graphics). Это позволяет увидеть траекторию на экране.
create ()
{
const path = new Phaser.Curves.Path(this.cache.json.get('waves'));
const graphics = this.add.graphics().lineStyle(1, 0x2d2d2d, 1);
path.draw(graphics);
// ... Дальше создание последователей
}
Создание последователей (Followers)
Последователь — это специальный игровой объект (Follower), привязанный к пути. Мы создаем 20 таких объектов в цикле, используя фабричный метод this.add.follower. Первые три аргумента — это сам путь, стартовые координаты X, Y (они будут проигнорированы из-за positionOnPath) и ключ текстуры.
for (let i = 0; i < 20; i++)
{
const follower = this.add.follower(path, 0, 0, 'ship');
// ... Настройка движения
}
Настройка движения: старт с задержкой
Ключевой метод для запуска движения — follower.startFollow(). Он принимает объект конфигурации:
* duration: Время в миллисекундах, за которое последователь проходит весь путь.
* positionOnPath: Если true, объект стартует с начала пути, а не с переданных координат (0,0).
* repeat: Количество повторений (-1 для бесконечного цикла).
* ease: Функция плавности. 'Linear' обеспечивает постоянную скорость.
* delay: Задержка перед стартом для каждого объекта. Умножение i * 70 создает эффект «гусеницы».
follower.startFollow({
duration: 5000,
positionOnPath: true,
repeat: -1,
ease: 'Linear',
delay: i * 70
});
Конфигурация игры
Стандартная конфигурация игры Phaser. Важно убедиться, что parent соответствует ID HTML-элемента на вашей странице, куда будет встроен Canvas.
const config = {
type: Phaser.AUTO,
width: 800,
height: 600,
backgroundColor: '#000000',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Что попробовать дальше
Система Path и Follower в Phaser — это мощный инструмент для создания сложного патрульного движения, траекторий снарядов или путей для кат-сцен. Вы можете экспериментировать: изменять ease-функции для ускорения/замедления, динамически менять путь в реальном времени или привязывать к пути камеру для следования за лидером. Попробуйте генерировать пути алгоритмически или загружать более сложные из редакторов уровней.
