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

Управление размером игровых объектов — базовая, но критически важная операция в геймдеве. В Phaser 3 для этого есть несколько интуитивных методов. Эта статья на практическом примере разберет, как работать со свойствами `scaleX`, `scaleY` и методом `setScale()`. Вы научитесь деформировать спрайты, равномерно менять их размер и поймете, когда какой подход использовать для точного контроля за внешним видом вашей игры.

Версия 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('atari', 'assets/sprites/atari130xe.png');
    }

    create ()
    {
        //  setScale sets the x and y scale values
        this.add.image(100, 300, 'atari').setScale(0.5, 0.2);

        //  If you just provide one value then both x and y are set to it
        this.add.image(400, 300, 'atari').setScale(2);

        const image2 = this.add.image(800, 300, 'atari');

        //  You can also set the scale via the scaleX and scaleY properties:
        image2.scaleX = 0.5;
        image2.scaleY = 4.5;
    }
}

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

const game = new Phaser.Game(config);

Основы масштабирования: метод setScale()

Самый частый способ изменить размер спрайта — использовать метод setScale(). Он вызывается непосредственно у объекта изображения (Image) после его создания.

Метод может принимать один или два аргумента. Если передать одно число, и горизонтальный (scaleX), и вертикальный (scaleY) масштаб установятся на это значение. Это удобно для пропорционального увеличения или уменьшения.

this.add.image(400, 300, 'atari').setScale(2);

Если передать два аргумента, вы получите независимый контроль по осям. Первый аргумент — масштаб по X, второй — по Y.

this.add.image(100, 300, 'atari').setScale(0.5, 0.2);

Прямое управление через свойства scaleX и scaleY

Иногда вам может понадобиться изменить масштаб уже после создания объекта или модифицировать только одну ось. Для этого у каждого игрового объекта есть прямые свойства scaleX и scaleY.

Вы можете задавать им числовые значения. Это особенно полезно в игровой логике, например, в методе update(), для анимации или реакции на действия игрока.

const image2 = this.add.image(800, 300, 'atari');
image2.scaleX = 0.5;
image2.scaleY = 4.5;

Обратите внимание: изменение этих свойств происходит мгновенно и перезаписывает предыдущие значения масштаба, установленные через setScale().

Практика: создание сцены с примерами

Давайте соберем всю теорию в одну рабочую сцену. В методе preload() загружается спрайт, а в create() — создаются три его копии с разными типами масштабирования.

class Example extends Phaser.Scene {
    preload () {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('atari', 'assets/sprites/atari130xe.png');
    }

    create () {
        // Сжатие по обеим осям с разными коэффициентами
        this.add.image(100, 300, 'atari').setScale(0.5, 0.2);

        // Равномерное увеличение в 2 раза
        this.add.image(400, 300, 'atari').setScale(2);

        // Создание объекта и последующее изменение свойств
        const image2 = this.add.image(800, 300, 'atari');
        image2.scaleX = 0.5;
        image2.scaleY = 4.5;
    }
}

Конфигурация игры и запуск

Для запуска примера необходима стандартная конфигурация игры Phaser. Ключевой момент здесь — pixelArt: true. Эта настройка включает специальный режим фильтрации для пиксельной графики, который предотвращает её размытие при масштабировании.

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    width: 1024,
    height: 600,
    pixelArt: true, // Важно для сохранения четкости спрайтов
    scene: Example  // Указываем нашу сцену
};

const game = new Phaser.Game(config);

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

Масштабирование в Phaser 3 реализовано гибко: используйте setScale() для быстрой настройки при создании, а свойства scaleX и scaleY — для динамического управления в игровом цикле. Для экспериментов попробуйте анимировать масштаб в update(), создавая эффект пульсации, или привяжите изменение размера объекта к силе нажатия клавиши, чтобы реализовать нестандартную механику.