О чем этот пример
Градиенты в Phaser — это мощный инструмент для создания визуально богатых игровых сцен без использования тяжёлых текстур. В примере показано, как с помощью объекта `Gradient` можно оживить фон и интерфейсные элементы, применяя анимацию к их положению, вращению и свойствам заливки. Это полезно для разработчиков, которые хотят добавить атмосферности игру, оптимизировать производительность (градиенты рендерятся GPU) или создать плавные переходы цветов в UI.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
bg;
gradient;
create ()
{
// Sneaky background gradient
this.bg = this.add.gradient({
shapeMode: 2,
start: { x: 0.5, y: 0.5 },
shape: { x: 0, y: 0.55 },
bands: [
{
colorStart: 0x442211,
colorEnd: 0x6699bb,
colorSpace: 1,
interpolation: 4,
}
]
}, 400, 300, 1400, 800)
.setRotation(-0.25);
this.gradient = this.add.gradient({
shapeMode: 0, // LINEAR
}, 400, 300, 400, 400);
// Or, because this is default:
// this.gradient = this.add.gradient({}, 400, 300, 400, 400);
}
update (time, delta)
{
const t = this.game.loop.time;
this.bg.rotation = 0.25 * Math.sin(t / 3000);
this.gradient.rotation = 0.03 * Math.sin(t / 1234);
this.gradient.setPosition(
400 + 16 * Math.sin(t / 876),
300 + 16 * Math.sin(t / 765)
);
}
}
const config = {
type: Phaser.WEBGL,
width: 800,
height: 600,
backgroundColor: '#2d2d2d',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Инициализация градиента: базовый синтаксис
Создание градиента в Phaser происходит через метод this.add.gradient(). Он принимает объект конфигурации и параметры позиционирования. В примере используется два градиента: один для фона, другой — для анимируемого объекта.
this.gradient = this.add.gradient({
shapeMode: 0, // LINEAR
}, 400, 300, 400, 400);
Параметры:
- Конфигурационный объект (первый аргумент) задаёт тип градиента (shapeMode).
- Следующие четыре числа — это `x,y,widthиheight` градиента.
- При shapeMode: 0 (LINEAR) градиент заполняет прямоугольную область линейным переходом цветов. Это значение по умолчанию, поэтому конфиг может быть пустым объектом {}.
Расширенная конфигурация: радиальный градиент
Второй градиент в примере (this.bg) демонстрирует более сложную настройку — радиальный градиент с кастомизацией цветовых полос.
this.bg = this.add.gradient({
shapeMode: 2,
start: { x: 0.5, y: 0.5 },
shape: { x: 0, y: 0.55 },
bands: [
{
colorStart: 0x442211,
colorEnd: 0x6699bb,
colorSpace: 1,
interpolation: 4,
}
]
}, 400, 300, 1400, 800)
.setRotation(-0.25);
Ключевые параметры:
- shapeMode: 2 — устанавливает радиальный (круговой) тип градиента.
- start — точка начала градиента в нормализованных координатах (от 0 до 1).
- shape — определяет форму/размер радиального градиента.
- bands — массив цветовых полос, где каждая полоса задаёт начальный и конечный цвет, цветовое пространство (colorSpace) и метод интерполяции (interpolation).
- .setRotation() — применяет начальный поворот к объекту.
Анимация градиентов в реальном времени
Основная динамика достигается в методе update(), который вызывается каждый кадр. Здесь изменяются свойства градиентов на основе времени игры.
update (time, delta)
{
const t = this.game.loop.time;
this.bg.rotation = 0.25 * Math.sin(t / 3000);
this.gradient.rotation = 0.03 * Math.sin(t / 1234);
this.gradient.setPosition(
400 + 16 * Math.sin(t / 876),
300 + 16 * Math.sin(t / 765)
);
}
Что происходит:
- this.game.loop.time — текущее время игры в миллисекундах.
- Свойство .rotation меняется по синусоиде, создавая плавное вращение.
- setPosition() двигает градиент по эллиптической траектории, используя разные делители для `t`, чтобы оси X и Y двигались несинхронно.
- Такая анимация выполняется эффективно, так как затрагивает только трансформации объекта, а не перерисовку градиента с нуля.
Конфигурация сцены и запуск игры
Код завершается стандартной для Phaser конфигурацией игры и созданием экземпляра Phaser.Game.
const config = {
type: Phaser.WEBGL,
width: 800,
height: 600,
backgroundColor: '#2d2d2d',
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Важные моменты:
- type: Phaser.WEBGL — градиенты требуют WebGL-рендерера.
- backgroundColor задаёт цвет фона HTML-канваса (не путать с градиентом внутри сцены).
- parent — ID DOM-элемента, в который будет встроен канвас игры.
- Класс Example передаётся как сцена, которая будет запущена автоматически.
Что попробовать дальше
Градиенты в Phaser — это гибкий и производительный способ создания динамического визуала. Вы можете экспериментировать: менять shapeMode на другие значения (например, конический градиент), анимировать цвета внутри bands, комбинировать несколько градиентов для сложных эффектов или привязывать их движение к игровой логике (например, к здоровью персонажа). Это отличная замена статичным текстурам для фонов, аур, энергетических полей и UI-подсветки.
