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

В игровой разработке часто требуется динамически изменять размеры объектов, например, для анимации роста, создания эффектов выделения или визуализации зон поражения. Phaser предоставляет мощный инструментарий для работы с геометрией, который позволяет делать это эффективно и без лишнего кода. В этой статье мы разберем, как использовать метод `setSize` из класса `Phaser.Geom.Rectangle` для изменения размеров прямоугольника прямо во время выполнения программы, и как это можно применить в реальных игровых механиках.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    create ()
    {
        const rect = new Phaser.Geom.Rectangle();

        const graphics = this.add.graphics({ lineStyle: { color: 0x0000ff } });

        for (let i = 0; i < 34; i++)
        {
            rect.setSize(i * 24, i * 18);

            graphics.strokeRectShape(rect);
        }
    }
}

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

const game = new Phaser.Game(config);

Основы: Класс Phaser.Geom.Rectangle

Класс Phaser.Geom.Rectangle является частью геометрического модуля Phaser и представляет собой прямоугольник, определяемый координатами верхнего левого угла (x, y), шириной и высотой. Он полезен для расчетов столкновений, отрисовки областей и хранения границ объектов.

По умолчанию, создавая прямоугольник без аргументов, мы получаем объект с нулевыми координатами и размерами.

const rect = new Phaser.Geom.Rectangle();

Динамическое изменение размера с помощью setSize

Метод setSize позволяет изменить ширину и высоту существующего прямоугольника, не создавая новый объект. Это эффективно по памяти и производительности. Метод принимает два аргумента: новую ширину (width) и новую высоту (height).

В примере из исходника этот метод вызывается в цикле, где размеры рассчитываются на основе переменной `i`, создавая эффект постепенного увеличения.

rect.setSize(i * 24, i * 18);

Здесь при каждой итерации ширина становится равна i * 24, а высота — i * 18. Это линейное увеличение, но формула может быть любой, подходящей под вашу задачу (например, квадратичной для ускоренного роста).

Визуализация изменений: Использование Graphics

Чтобы увидеть изменения прямоугольника, его нужно нарисовать. Для этого в Phaser используется объект Graphics, который позволяет рисовать примитивы. В коде создается объект graphics с синим цветом линии.

const graphics = this.add.graphics({ lineStyle: { color: 0x0000ff } });

После каждого изменения размера прямоугольника мы вызываем метод strokeRectShape, который рисует контур (обводку) переданного прямоугольника. Важно, что мы рисуем один и тот же объект rect, но с новыми размерами.

graphics.strokeRectShape(rect);

Поскольку отрисовка происходит в цикле 34 раза, на экране появляется серия вложенных прямоугольников, наглядно демонстрирующая работу setSize.

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

Динамическое изменение размеров прямоугольника — это не просто учебный пример. Вот несколько практических сценариев из игр:

* **Анимация индикатора здоровья или зарядки:** Прямоугольник, ширина которого зависит от текущего значения здоровья/заряда. * **Область эффекта навыка:** Визуализация радиуса действия заклинания, которая может увеличиваться по мере прокачки навыка. * **Выделение объектов (Hover/Select эффект):** Плавное увеличение рамки вокруг выбранного предмета в инвентаре. * **Генерация procedural контента:** Создание комнат случайного размера в rogue-like играх.

Ключевое преимущество — вы работаете с одним объектом, что упрощает логику и обновление его состояния.

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

Метод setSize класса Phaser.Geom.Rectangle — это простой, но мощный инструмент для динамического управления размерами прямоугольных областей в вашей игре. Он отлично сочетается с объектом Graphics для быстрой визуализации. **Идеи для экспериментов:** 1. Попробуйте изменить формулу расчета размеров внутри цикла, используя Math.sin(i) для создания пульсирующего эффекта. 2. Свяжите размер прямоугольника с положением курсора мыши, используя координаты из события pointermove. 3. Создайте несколько прямоугольников с разными начальными точками и изменяйте их размеры независимо в одном цикле. 4. Используйте полученные прямоугольники не только для отрисовки, но и для проверки столкновений с помощью Phaser.Geom.Rectangle.Contains.