О чем этот пример
Статичные текстуры в игре могут выглядеть скучно. Phaser предоставляет набор утилит `Phaser.Actions` для быстрого добавления анимационных эффектов к игровым объектам. В этой статье мы разберем, как с помощью одного вызова `Phaser.Actions.AddEffectShine` оживить фоновое изображение, придав ему динамичный эффект переливающегося сияния. Этот прием отлично подходит для создания визуально привлекательных меню, интерактивных кнопок или магических аур.
Версия 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('bg', 'assets/textures/gold.png');
this.load.image('displacement', 'assets/textures/gold-n.png');
}
create ()
{
const bg = this.add.image(this.sys.scale.width / 2, this.sys.scale.height / 2, 'bg');
Phaser.Actions.FitToRegion(bg, 1);
Phaser.Actions.AddEffectShine(bg, {
displacementMap: 'displacement',
displacement: 1,
colorFactor: [ 0, 1, 2, 1 ],
direction: 0,
scale: 1,
duration: 5000,
ease: 'Quad.inout',
yoyo: true
});
}
}
const config = {
type: Phaser.AUTO,
width: 1280,
height: 720,
backgroundColor: '#2f3640',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Загрузка ресурсов
Первым делом в методе preload() мы загружаем две текстуры. Первая — основное изображение фона (bg). Вторая — так называемая displacement-карта (displacement). Это специальное черно-белое изображение, которое будет использоваться для создания эффекта искажения и сияния. Светлые и темные области на этой карте определяют, как будет "сдвигаться" основной рисунок.
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('bg', 'assets/textures/gold.png');
this.load.image('displacement', 'assets/textures/gold-n.png');
Создание и настройка фона
В методе create() мы создаем спрайт фона и позиционируем его по центру экрана. После этого применяем к нему действие Phaser.Actions.FitToRegion. Эта функция масштабирует изображение так, чтобы оно полностью заполнило заданную область. В данном случае `1` — это ссылка на область всего игрового окна.
const bg = this.add.image(this.sys.scale.width / 2, this.sys.scale.height / 2, 'bg');
Phaser.Actions.FitToRegion(bg, 1);
Применение эффекта сияния
Ключевой момент — вызов Phaser.Actions.AddEffectShine. Этот метод принимает игровой объект (наш фон) и конфигурационный объект с параметрами эффекта. Эффект автоматически стартует и управляет собой после вызова.
Разберем параметры:
- displacementMap: ключ текстуры displacement-карты.
- displacement: сила смещения, создаваемого картой.
- colorFactor: массив из четырех чисел, управляющих смешением цветов для создания свечения. Значения соответствуют каналам: красный, зеленый, синий и общая яркость.
- direction: направление движения эффекта (в градусах).
- scale: масштаб эффекта.
- duration: длительность одного цикла анимации в миллисекундах.
- ease: функция плавности (easing) для анимации.
- yoyo: если true, анимация будет проигрываться вперед и назад.
Phaser.Actions.AddEffectShine(bg, {
displacementMap: 'displacement',
displacement: 1,
colorFactor: [ 0, 1, 2, 1 ],
direction: 0,
scale: 1,
duration: 5000,
ease: 'Quad.inout',
yoyo: true
});
Настройка игры
Конфигурационный объект игры задает базовые параметры: тип рендерера, размеры окна, цвет фона и ссылку на основную сцену.
const config = {
type: Phaser.AUTO,
width: 1280,
height: 720,
backgroundColor: '#2f3640',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Что попробовать дальше
Метод Phaser.Actions.AddEffectShine — это мощный инструмент для быстрого добавления сложных визуальных эффектов без написания шейдеров вручную. Он идеально подходит для прототипирования и украшения UI-элементов. Для экспериментов попробуйте изменить параметр colorFactor на [2, 0, 1, 1] для другого оттенка свечения, увеличьте displacement для более агрессивного искажения или используйте другую displacement-карту для совершенно нового визуального стиля.
