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

Отражение спрайтов по горизонтали — базовая, но мощная техника в арсенале геймдева. Она экономит ресурсы, избавляя от загрузки дополнительных текстур, и оживляет игровой мир: заставляет персонажа развернуться, создаёт зеркальные ловушки или просто добавляет визуальное разнообразие. В этом руководстве мы разберём все три способа отражения изображения в Phaser 3, доступные прямо «из коробки».

Версия 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('pic', 'assets/pics/cougar-face-of-nature.png');
    }

    create ()
    {
        //  Default non-flipped image
        this.add.image(250, 164, 'pic');

        //  Flipped via a call to setFlipX
        this.add.image(250, 464, 'pic').setFlipX(true);

        const image = this.add.image(650, 164, 'pic');

        //  Flipped via setting the flipX property
        image.flipX = true;

        const image2 = this.add.image(650, 464, 'pic');

        this.input.on('pointerdown', () =>
        {

            //  Flipped via a call to toggleFlipX
            image2.toggleFlipX();

        });
    }
}

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

const game = new Phaser.Game(config);

Базовое отражение через `setFlipX`

Самый прямой и читаемый способ перевернуть изображение — использовать метод setFlipX(). Этот метод вызывается у экземпляра Image (или любого другого Game Object) и принимает булево значение.

//  Создаём изображение и сразу переворачиваем его
this.add.image(250, 464, 'pic').setFlipX(true);

В этом примере изображение с ключом 'pic' добавляется на сцену по координатам (250, 464) и сразу же отражается по горизонтали. Метод setFlipX(true) делает левую сторону изображения правой и наоборот. Это отличный подход для статичных, заранее известных отражений, например, для создания пары симметричных объектов в уровне.

Прямое управление свойством `flipX`

Phaser также позволяет управлять отражением напрямую, через свойство flipX. Это может быть удобно, когда вам нужно проверить текущее состояние объекта или интегрировать отражение в более сложную логику.

const image = this.add.image(650, 164, 'pic');
//  Присваиваем свойству flipX значение true
image.flipX = true;

Здесь мы сначала создаём объект image, сохраняем ссылку на него в переменную, а затем устанавливаем его свойство flipX в true. Результат будет идентичен вызову setFlipX(true). Использование свойства напрямую особенно полезно в условиях:

if (player.x > enemy.x) {
    enemy.flipX = true; // Враг смотрит на игрока слева
} else {
    enemy.flipX = false;
}

Динамическое переключение с `toggleFlipX`

Для интерактивных элементов или анимаций, где состояние отражения нужно менять на противоположное, идеально подходит метод toggleFlipX(). Он не требует запоминания текущего состояния — Phaser сделает это за вас.

const image2 = this.add.image(650, 464, 'pic');

this.input.on('pointerdown', () => {
    //  Каждый клик будет переворачивать изображение
    image2.toggleFlipX();
});

В данном фрагменте изображение image2 будет зеркально переворачиваться при каждом клике мышью. Этот метод незаменим для реализации поведения, когда персонаж поворачивается в направлении движения, или для создания простых двухфазных анимаций (например, открывание/закрывание двери, если текстура симметрична).

Важные нюансы и общая логика

Все три описанных способа манипулируют одним и тем же внутренним свойством объекта. Вызов setFlipX(true) и присваивание flipX = true делают абсолютно одно и то же. Метод toggleFlipX() просто инвертирует текущее значение этого свойства.

//  Эти две строки эквивалентны:
image.setFlipX(true);
image.flipX = true;

//  А эта строка изменит состояние на противоположное:
image.toggleFlipX(); // Если было true, станет false, и наоборот

Важно помнить, что точка **опоры** (origin), вокруг которой происходит отражение, по умолчанию находится в центре объекта (0.5, 0.5). Изменяя свойство originX, вы можете сместить ось отражения, что полезно для корректировки позиции после переворота.

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

Phaser предлагает гибкий и интуитивно понятный инструментарий для отражения игровых объектов. Используйте setFlipX() для инициализации, управляйте flipX для сложной логики и применяйте toggleFlipX() для динамической инверсии. Для экспериментов попробуйте связать отражение с направлением скорости персонажа, создать зеркальную комнату, где все объекты перевёрнуты, или анимировать свойство flipX через твины для плавного "эффекта разворота".