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

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

Версия 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/skies/background1.png');
    }

    create ()
    {
        this.add.image(400, 300, 'bg');

        const data = [ 0,20, 84,20, 84,0, 120,50, 84,100, 84,80, 0,80 ];

        const r1 = this.add.polygon(200, 200, data, 0x6666ff);

        const r2 = this.add.polygon(400, 200, data, 0x9966ff);

        r2.setStrokeStyle(4, 0xefc53f);

        const r3 = this.add.polygon(600, 200, data);

        r3.setStrokeStyle(2, 0x1a65ac);

        const r4 = this.add.polygon(200, 400, data, 0xff6699);

        const r5 = this.add.polygon(400, 400, data, 0xff33cc);

        const r6 = this.add.polygon(600, 400, data, 0xff66ff);

        this.tweens.add({

            targets: r4,
            scaleX: 0.25,
            scaleY: 0.5,
            yoyo: true,
            repeat: -1,
            ease: 'Sine.easeInOut'

        });

        this.tweens.add({

            targets: r5,
            alpha: 0.2,
            yoyo: true,
            repeat: -1,
            ease: 'Sine.easeInOut'

        });

        this.tweens.add({

            targets: r6,
            angle: 90,
            yoyo: true,
            repeat: -1,
            ease: 'Sine.easeInOut'

        });
    }
}

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

const game = new Phaser.Game(config);

Подготовка сцены и загрузка ассетов

Как и в любом проекте на Phaser, работа начинается с подготовки сцены. В методе preload мы устанавливаем базовый URL для загрузки ресурсов и загружаем фоновое изображение. Это стандартная практика, которая гарантирует, что все необходимые ассеты будут готовы к моменту создания игровых объектов.

preload ()
{
    this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
    this.load.image('bg', 'assets/skies/background1.png');
}

В методе create мы первым делом размещаем фоновое изображение, чтобы создать визуальный контекст для наших полигонов.

Создание полигона: основа — массив точек

Ключевой элемент при создании полигона — это массив данных, описывающий его форму. Каждые два числа в массиве представляют собой координаты X и Y одной вершины относительно центра полигона.

const data = [ 0,20, 84,20, 84,0, 120,50, 84,100, 84,80, 0,80 ];

Этот массив описывает фигуру, похожую на стрелку или шестиугольник со смещенной вершиной. Первый полигон создается с помощью метода this.add.polygon(x, y, data, fillColor). Первые два аргумента задают позицию центра фигуры на сцене, третий — массив данных, а четвертый — цвет заливки в шестнадцатеричном формате (например, 0x6666ff).

const r1 = this.add.polygon(200, 200, data, 0x6666ff);

Настройка внешнего вида: обводка и цвет

Phaser позволяет не только заливать полигон цветом, но и добавлять контур. В примере второй полигон r2 создается с заливкой, а затем для него вызывается метод setStrokeStyle(lineWidth, strokeColor), который добавляет обводку заданной толщины и цвета.

const r2 = this.add.polygon(400, 200, data, 0x9966ff);
r2.setStrokeStyle(4, 0xefc53f);

Третий полигон r3 создается без указания цвета заливки, что делает его прозрачным, но с хорошо видимой обводкой. Это полезно для создания контуров или рамок.

const r3 = this.add.polygon(600, 200, data);
r3.setStrokeStyle(2, 0x1a65ac);

Динамическая анимация с помощью твинов

Настоящая магия начинается, когда статические фигуры оживают. Phaser предоставляет мощную систему твинов через this.tweens. В примере три нижних полигона (r4, r5, r6) анимируются по-разному.

Полигон r4 масштабируется по осям X и Y с эффектом "йо-йо" (возврат к исходному состоянию) и бесконечным повторением.

this.tweens.add({
    targets: r4,
    scaleX: 0.25,
    scaleY: 0.5,
    yoyo: true,
    repeat: -1,
    ease: 'Sine.easeInOut'
});

Полигон r5 плавно изменяет свою прозрачность (alpha), создавая эффект пульсации или мерцания.

this.tweens.add({
    targets: r5,
    alpha: 0.2,
    yoyo: true,
    repeat: -1,
    ease: 'Sine.easeInOut'
});

Полигон r6 вращается, изменяя свой угол (angle). Это отлично подходит для создания вращающихся элементов интерфейса, стрелок или декоративных элементов.

this.tweens.add({
    targets: r6,
    angle: 90,
    yoyo: true,
    repeat: -1,
    ease: 'Sine.easeInOut'
});

Ключевые параметры твина: targets (объект для анимации), yoyo: true (возврат к началу), repeat: -1 (бесконечное повторение) и ease (функция плавности, определяющая характер движения).

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

Полигоны в Phaser — это не просто статические фигуры, а полноценные игровые объекты, которые можно создавать, стилизовать и анимировать. Они открывают широкие возможности для создания уникального визуального стиля: от сложных геометрических паттернов до анимированных элементов HUD. Для экспериментов попробуйте: изменить массив data, чтобы нарисовать собственную фигуру; комбинировать несколько твинов на одном объекте (например, вращение + пульсация); или использовать полигоны в качестве хитбоксов для нестандартной физической формы объекта.