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

Визуальный интерфейт, меню, диалоговые окна или просто декоративные элементы — часто требуют фонов с закруглёнными углами. Рисовать такие фигуры вручную сложно. Класс `Graphics` в Phaser 3 предоставляет для этого удобный метод `fillRoundedRect()`. Эта статья покажет, как им пользоваться для создания прямоугольников как с равномерными, так и с разными радиусами скругления для каждого угла. Это базовый, но мощный инструмент для UI и визуального оформления вашей игры.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    graphics;

    create ()
    {
        this.graphics = this.add.graphics();

        this.graphics.fillStyle(0xffff00, 1);

        //  32px radius on the corners
        this.graphics.fillRoundedRect(32, 32, 300, 200, 32);

        this.graphics.fillStyle(0xff00ff, 1);

        //  Using an object to define a different radius per corner
        this.graphics.fillRoundedRect(360, 240, 400, 300, { tl: 64, tr: 22, bl: 12, br: 0 });
    }
}

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

const game = new Phaser.Game(config);

Подготовка Graphics-объекта

Перед тем как рисовать, нужно создать объект Graphics. Он выступает в роли холста для векторных примитивов. Также необходимо задать цвет и прозрачность заливки с помощью fillStyle().

this.graphics = this.add.graphics();
this.graphics.fillStyle(0xffff00, 1);

В этом примере создаётся объект graphics и устанавливается стиль заливки — ярко-жёлтый цвет (0xffff00) с полной непрозрачностью (альфа-канал `1`).

Прямоугольник с равномерными скруглениями

Самый простой способ — указать один радиус скругления для всех четырёх углов. Метод fillRoundedRect() принимает координаты X и Y левого верхнего угла, ширину, высоту и радиус скругления.

this.graphics.fillRoundedRect(32, 32, 300, 200, 32);

Эта строка кода нарисует прямоугольник размером 300x200 пикселей, сдвинутый на 32 пикселя от левого и верхнего края. Все его углы будут скруглены с радиусом 32 пикселя.

Прямоугольник с разными радиусами для углов

Для более сложных и гибких дизайнов можно задать уникальный радиус для каждого угла. Вместо числа в последний параметр передаётся объект с ключами tl (top-left — верхний левый), tr (top-right — верхний правый), bl (bottom-left — нижний левый), br (bottom-right — нижний правый).

this.graphics.fillRoundedRect(360, 240, 400, 300, { tl: 64, tr: 22, bl: 12, br: 0 });

Здесь рисуется второй прямоугольник. У него: очень скруглённый левый верхний угол (64), умеренно скруглённый правый верхний (22), слабо скруглённый левый нижний (12) и абсолютно прямой правый нижний угол (`0`). Это позволяет создавать сложные несимметричные формы.

Полный код сцены и запуск игры

Вся логика рисования размещается в методе create() сцены. Конфигурационный объект config задаёт основные параметры игры, такие как размеры холста и используемая сцена.

class Example extends Phaser.Scene {
    graphics;
    create () {
        this.graphics = this.add.graphics();
        this.graphics.fillStyle(0xffff00, 1);
        this.graphics.fillRoundedRect(32, 32, 300, 200, 32);

        this.graphics.fillStyle(0xff00ff, 1);
        this.graphics.fillRoundedRect(360, 240, 400, 300, { tl: 64, tr: 22, bl: 12, br: 0 });
    }
}

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

const game = new Phaser.Game(config);

После создания экземпляра Phaser.Game с этой конфигурацией автоматически запустится сцена Example, и на экране появятся два скруглённых прямоугольника.

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

Метод fillRoundedRect() — это простой и эффективный способ добавить в игру элементы с современным скруглённым дизайном. Для экспериментов попробуйте анимировать радиус скругления, изменяя его значения в игровом цикле update(), или комбинируйте несколько прямоугольников для создания сложных UI-компонентов, таких как панели здоровья с закруглёнными концами.