О чем этот пример
Статичный фон — это скучно. В Phaser есть мощный, но малоизвестный игровой объект `Noise`, который позволяет создавать динамические текстуры шума прямо в реальном времени, без загрузки внешних изображений. Эта техника идеально подходит для создания фонов с эффектом помех, мерцающих экранов или абстрактных анимированных текстур, которые могут оживить меню или игровую локацию. В этой статье мы разберем простой пример и покажем, как управлять шумом с помощью кода.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
noise;
create()
{
const { width, height } = this.scale;
this.noise = this.add.noise({}, width / 2, height / 2, width, height);
this.time.addEvent(
{
delay: 1000,
loop: true,
callback: () => this.noise.noiseOffset = [
Math.random(),
Math.random()
]
}
);
}
}
const config = {
type: Phaser.WEBGL,
parent: 'phaser-example',
width: 1280,
height: 720,
scene: Example
};
const game = new Phaser.Game(config);
Что такое объект Noise?
В Phaser класс Noise — это игровой объект, который генерирует и отображает текстуру процедурного шума Перлина. В отличие от спрайтов, он создает изображение программно, что позволяет динамически менять его параметры.
В нашем примере объект создается в центре сцены и занимает всю её ширину и высоту, что делает его идеальным полноэкранным фоном.
this.noise = this.add.noise({}, width / 2, height / 2, width, height);
Настройка и отображение
Метод this.add.noise() принимает несколько аргументов. Первый аргумент — это объект конфигурации, который в нашем примере пуст {}, что означает использование настроек по умолчанию. Следующие аргументы — это X и Y координаты центра объекта, а затем его ширина и высота.
Поскольку пример использует WebGL-рендерер (это указано в конфиге type: Phaser.WEBGL), шум рисуется с аппаратным ускорением, что обеспечивает высокую производительность даже при больших размерах и анимации.
const config = {
type: Phaser.WEBGL,
width: 1280,
height: 720,
scene: Example
};
Анимация через смещение (noiseOffset)
Статичная текстура шума — это только начало. Его настоящая сила раскрывается в возможности анимации через свойство noiseOffset. Это свойство представляет собой массив из двух чисел [x, y], которые смещают точку отсчета для генерации шума.
В примере мы используем событие таймера this.time.addEvent, которое срабатывает каждую секунду (delay: 1000) и в цикле (loop: true) задает случайное смещение. В результате каждую секунду текстура шума "перерисовывается" с новой начальной точки, создавая эффект мерцания или плавного перетекания.
this.time.addEvent({
delay: 1000,
loop: true,
callback: () => this.noise.noiseOffset = [
Math.random(),
Math.random()
]
});
Что попробовать дальше
Объект Noise в Phaser — это простой и эффективный инструмент для создания динамических фонов и визуальных эффектов. Всего несколько строк кода позволяют получить анимированную текстуру, которая не нагружает память загрузкой изображений. Для экспериментов попробуйте изменить интервал таймера для более плавной или резкой анимации, поиграйте с размерами объекта или создайте несколько слоев шума с разными параметрами и режимами наложения (blendMode), чтобы получить сложные визуальные композиции.
