О чем этот пример
Отражение спрайтов по горизонтали — базовая, но мощная техника в арсенале геймдева. Она экономит ресурсы, избавляя от загрузки дополнительных текстур, и оживляет игровой мир: заставляет персонажа развернуться, создаёт зеркальные ловушки или просто добавляет визуальное разнообразие. В этом руководстве мы разберём все три способа отражения изображения в 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 через твины для плавного "эффекта разворота".
