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

Cellular Noise (ячеистый шум) в Phaser — это мощный инструмент для генерации текстур, ландшафтов и визуальных эффектов с органичной, ячеистой структурой. Часто его используют статично, но настоящее волшебство начинается, когда мы анимируем параметры шума в реальном времени. Эта статья покажет, как управлять свойствами `noiseVariation` для 2D, 3D и 4D версий шума, создавая плавно меняющиеся, живые паттерны. Вы научитесь оживлять фоны, создавать эффекты магических полей или динамичные текстуры воды, управляя всего одним параметром.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    noise2D;
    noise3D;
    noise4D;

    create()
    {
        const { width, height } = this.scale;

        this.noise2D = this.add.noisecell2d({ noiseCells: [ 5, 9] }, width * 1 / 6, height / 2, width / 3, height);
        this.noise3D = this.add.noisecell3d({ noiseCells: [ 5, 9, 4 ] }, width * 3 / 6, height / 2, width / 3, height);
        this.noise4D = this.add.noisecell4d({ noiseCells: [ 5, 9, 4, 4 ] }, width * 5 / 6, height / 2, width / 3, height);

        this.add.text(10, 10, '2D', { fontSize: 24 }).setStroke('#ff8844', 2).setShadow(2, 2, '#333333', 2, true, false);
        this.add.text(width / 3 + 10, 10, '3D', { fontSize: 24 }).setStroke('#ff8844', 2).setShadow(2, 2, '#333333', 2, true, false);
        this.add.text(width * 2 / 3 + 10, 10, '4D', { fontSize: 24 }).setStroke('#ff8844', 2).setShadow(2, 2, '#333333', 2, true, false);
    }

    update (time)
    {
        const v = Math.cos(time / 1000) * 0.5 + 0.5;

        this.noise2D.noiseVariation = [ v, v ];
        this.noise3D.noiseVariation = [ v, v, v ];
        this.noise4D.noiseVariation = [ v, v, v, v ];
    }
}

const config = {
    type: Phaser.WEBGL,
    parent: 'phaser-example',
    width: 1280,
    height: 720,
    scene: Example
};

const game = new Phaser.Game(config);

Создание объектов Cellular Noise

В методе create() сцены создаются три объекта шума: 2D, 3D и 4D. Каждый из них — это специальный игровой объект (NoiseCell2D, NoiseCell3D, NoiseCell4D), который можно добавить через фабрику this.add.

Ключевой параметр при создании — noiseCells. Это массив целых чисел, определяющий количество ячеек шума по каждой оси. Например, для 2D шума [5, 9] означает 5 ячеек по ширине и 9 по высоте генерируемой текстуры.

Позиция и размер каждого объекта рассчитываются относительно размеров окна игры (this.scale), чтобы расположить их в ряд.

const { width, height } = this.scale;

this.noise2D = this.add.noisecell2d(
  { noiseCells: [ 5, 9] },
  width * 1 / 6,
  height / 2,
  width / 3,
  height
);

Динамическое свойство `noiseVariation`

Сердце анимации — свойство noiseVariation. Оно доступно у каждого созданного объекта шума и представляет собой массив чисел (по одному на каждое измерение). Эти числа влияют на то, как внутри каждой ячейки генерируется вариация паттерна.

В исходном коде значение `v` рассчитывается на основе времени, используя косинус. Это создает плавное циклическое изменение от 0 до 1.

const v = Math.cos(time / 1000) * 0.5 + 0.5;

Затем это значение присваивается всем компонентам noiseVariation для каждого объекта. Для 2D шума нужен массив из двух значений, для 3D — из трех, и так далее.

this.noise2D.noiseVariation = [ v, v ];
this.noise3D.noiseVariation = [ v, v, v ];
this.noise4D.noiseVariation = [ v, v, v, v ];

Изменение этого массива в update() заставляет текстуру каждого объекта плавно перестраиваться каждый кадр, создавая эффект пульсации или "дыхания" паттерна.

Различия между 2D, 3D и 4D шумом

Основное различие между объектами — в размерности пространства, в котором генерируется шум, и, как следствие, в визуальной сложности результата.

* **2D (noisecell2d)**: Работает в двух измерениях (X, Y). Создает классический ячеистый паттерн, похожий на плитку, кожу или пузыри. Изменение noiseVariation заставляет границы и внутреннюю текстуру ячеек плавно деформироваться. * **3D (noisecell3d)**: Добавляет третье измерение. Можно представить, что мы смотрим на срез трехмерного поля ячеек. Анимация noiseVariation создает более сложные, объемные переходы, как если бы мы двигались сквозь это поле. * **4D (noisecell4d)**: Работает в четырех измерениях. Визуализировать это сложно, но на практике получается невероятно богатый и сложный паттерн, изменения в котором выглядят максимально органичными и непредсказуемыми, идеально подходя для фантастических или абстрактных эффектов.

Чем выше размерность, тем больше вычислительная нагрузка, но и визуальный результат становится интереснее.

Практическое применение и настройка

Управление noiseVariation открывает много возможностей.

**Создание живого фона:** Используйте 2D или 3D шум как текстуру для спрайта, заполняющего весь экран. Плавное изменение noiseVariation создаст эффект мерцающего энергетического поля, текущей лавы или ряби на воде.

**Маски и области влияния:** Наложите объект шума с режимом blend mode на другие элементы. Анимированный шум может создавать эффект магического свечения, искажения пространства или постепенного проявления объекта.

**Эксперименты с параметрами:** 1. Измените функцию расчета `v. ПопробуйтеMath.sin(time / 500)для большей скорости илиMath.cos(time / 2000)` для медленных, эпичных изменений. 2. Используйте разные значения для каждого компонента массива. Например, [v, v*0.5, v*2] для 3D шума создаст асимметричную, более хаотичную анимацию. 3. Поиграйте с массивом noiseCells при создании. Меньшие значения (например, [3, 3]) дадут крупные, четкие ячейки. Большие значения ([15, 20]) создадут мелкую, почти зернистую текстуру.

// Пример: асимметричная вариация для 3D шума
this.noise3D.noiseVariation = [ v, v * 0.3, Math.sin(time / 800) * 0.5 + 0.5 ];

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

Свойство noiseVariation в Phaser — это простой, но мощный рычаг для анимации сложных процедурных текстур Cellular Noise. Меняя его во времени, вы превращаете статичный паттерн в живой, дышащий визуальный элемент. **Идеи для экспериментов:** 1. Свяжите значение `v` не со временем, а с расстоянием до курсора мыши, чтобы шум реагировал на взаимодействие игрока. 2. Используйте 4D шум в качестве карты высот для процедурного ландшафта (Plane геометрии) и анимируйте его, создавая "плавающий" или "перетекающий" рельеф. 3. Комбинируйте несколько слоев шума с разной скоростью анимации и режимами наложения (blendMode) для создания сверхсложных фоновых эффектов.