О чем этот пример

При разработке игр часто возникает задача разместить объекты вдоль линии или траектории: выстроить врагов, создать эффект следования или плавно распределить элементы интерфейса. Вручную рассчитывать позиции — долго и чревато ошибками. Phaser.Geom.Line предоставляет мощный метод GetEasedPoints, который автоматически генерирует массив точек с заданным интервалом, используя функции плавности (easing). Эта статья покажет, как за несколько строк кода превратить обычную линию в готовый маршрут для ваших игровых объектов.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    create ()
    {
        const graphics = this.add.graphics({ fillStyle: { color: 0xff0000 }});

        const line = new Phaser.Geom.Line(100, 100, 600, 500);

        graphics.lineStyle(2, 0x00ff00);
        graphics.strokeLineShape(line);

        const points = Phaser.Geom.Line.GetEasedPoints(line, 'sine.inout', 32);

        for (let i = 0; i < points.length; i++)
        {
            const p = points[i];

            graphics.fillRect(p.x - 2, p.y - 2, 4, 4);
        }
    }
}

const config = {
    width: 800,
    height: 600,
    type: Phaser.AUTO,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Создание линии и её визуализация

Вся работа происходит в методе create() сцены. Первым делом мы создаём объект Graphics для рисования на экране и определяем саму линию.

const graphics = this.add.graphics({ fillStyle: { color: 0xff0000 }});
const line = new Phaser.Geom.Line(100, 100, 600, 500);

Здесь line задаётся координатами начальной (100, 100) и конечной (600, 500) точек. Затем мы настраиваем стиль линии и рисуем её контур, чтобы визуально представить нашу геометрическую основу.

graphics.lineStyle(2, 0x00ff00);
graphics.strokeLineShape(line);

Магия метода GetEasedPoints

Ключевой этап — получение массива точек. Для этого используется статический метод Phaser.Geom.Line.GetEasedPoints().

const points = Phaser.Geom.Line.GetEasedPoints(line, 'sine.inout', 32);

Метод принимает три аргумента: 1. Объект линии (line). 2. Имя функции плавности ('sine.inout'). Phaser поддерживает множество стандартных функций (linear, quad, cubic и др.), которые влияют на распределение точек. 'Sine.inout' обеспечивает плавное ускорение и замедление в начале и конце линии. 3. Количество сегментов или точек (32). Фактически метод вернёт массив из 33 точек (количество точек = количество сегментов + 1), равномерно распределённых по линии с учётом выбранного easing.

Визуализация полученных точек

После получения массива points мы можем пройтись по нему циклом и отрисовать каждую точку. Это наглядно демонстрирует результат работы метода.

for (let i = 0; i < points.length; i++)
{
    const p = points[i];
    graphics.fillRect(p.x - 2, p.y - 2, 4, 4);
}

Каждая точка в массиве — это объект со свойствами `xиy`. Мы рисуем небольшой квадрат (4x4 пикселя), центрируя его на координатах точки (смещая на -2 по осям). В результате на зелёной линии появятся равномерно распределённые красные точки.

Практическое применение в играх

Полученный массив точек — это не просто визуализация. Это готовые координаты для размещения спрайтов.

// Создание группы врагов вдоль линии
points.forEach((point, index) => {
    let enemy = this.physics.add.sprite(point.x, point.y, 'enemyTexture');
    // ... настройка свойств врага
});
// Плавное перемещение объекта по точкам (как часть патрульного пути)
this.tweens.add({
    targets: playerSprite,
    x: { value: points.map(p => p.x), duration: 2000 },
    y: { values: points.map(p => p.y), duration: 2000 },
    ease: 'Linear'
});

Используйте разные функции easing (например, 'quad.out' или 'back.in') в вызове GetEasedPoints, чтобы точки группировались в начале или в конце линии, создавая уникальные паттерны движения или расстановки.

Что попробовать дальше

Метод Phaser.Geom.Line.GetEasedPoints — это элегантный и мощный инструмент для работы с траекториями. Он избавляет от рутинных математических расчётов и открывает простор для творчества при создании путей следования, расстановке объектов или генерации спецэффектов. Поэкспериментируйте: используйте полученные точки для создания цепочек звёзд в бэкграунде, разбросайте по ним бонусы на уровне или задайте траекторию для заклинания. Попробуйте комбинировать линии и разные функции плавности, чтобы создавать сложные нелинейные маршруты для ваших игровых объектов.