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

Визуальные эффекты на основе шума — это мощный инструмент для создания атмосферы в играх: от переливов воды и облаков до психоделических фонов. Phaser предоставляет встроенные объекты `add.noise` и `add.noisesimplex2d`, которые генерируют процедурные текстуры прямо во время выполнения, не требуя загрузки внешних изображений. Эта статья покажет, как управлять цветовыми градиентами, прозрачностью и анимацией шума, чтобы вы могли оживить фон вашей игры или создать уникальные визуальные элементы интерфейса.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    noise2;

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

        this.bg = this.add.noisesimplex2d({
            noiseColorStart: 0x88aaff,
            noiseColorEnd: 0xaaffff,
        }, width / 2, height / 2, width, height);

        // Set colors.
        this.add.noise({
            noiseColorStart: 0x88aaff,
            noiseColorEnd: 0xaaffff
        }, width * 1 / 8, height / 2, width / 4, height);

        // Color to transparent.
        this.noise2 = this.add.noise({
            noiseColorStart: [ 1, 12 / 16, 10 / 16 ],
            noiseColorEnd: [ 0, 0, 0, 0 ], // Use channel notation to include alpha.
            noisePower: 4
        }, width * 3 / 8, height / 2, width / 4, height);

        // Randomize color channels.
        this.add.noise({
            noiseRandomChannels: true
        }, width * 5 / 8, height / 2, width / 4, height);

        // Randomize color channels on specific colors.
        this.add.noise({
            noiseColorStart: 0xff0000,
            noiseColorEnd: 0x00ff00,
            noiseRandomChannels: true
        }, width * 7 / 8, height / 2, width / 4, height);
    }

    update (time)
    {
        this.bg.noiseFlow = time / 2000;

        this.noise2.noisePower = Math.sin(time / 1000) + 1;
    }
}

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

const game = new Phaser.Game(config);

Базовый фон с шумом

Основой для создания фона служит объект NoiseSimplex2D, который генерирует двумерный симплекс-шум с плавными переходами. В примере он используется как полноэкранный фон.

Ключевые параметры: - noiseColorStart и noiseColorEnd определяют начальный и конечный цвет градиента шума. - Позиция и размеры задаются после объекта.

this.bg = this.add.noisesimplex2d({
    noiseColorStart: 0x88aaff,
    noiseColorEnd: 0xaaffff,
}, width / 2, height / 2, width, height);

Здесь создаётся фон, плавно переходящий от голубого (0x88aaff) к светло-голубому (0xaaffff). Объект центрируется и растягивается на весь экран.

Цветовые градиенты и прозрачность

Объект add.noise позволяет создавать более компактные области шума с тонкой настройкой цвета. Важно: цвета можно задавать не только в HEX-формате (0xRRGGBB), но и в виде массива каналов [R, G, B, A], где значения нормализованы от 0 до 1.

this.noise2 = this.add.noise({
    noiseColorStart: [ 1, 12 / 16, 10 / 16 ], // Яркий желтоватый цвет
    noiseColorEnd: [ 0, 0, 0, 0 ], // Полностью прозрачный чёрный
    noisePower: 4 // Усиление контраста шума
}, width * 3 / 8, height / 2, width / 4, height);

Параметр noisePower контролирует степень контраста — чем выше значение, тем более выражены переходы между цветами. Установка альфа-канала в 0 для конечного цвета создаёт эффект плавного растворения.

Случайные каналы цвета

Для создания психоделических или хаотичных текстур можно рандомизировать цветовые каналы. Параметр noiseRandomChannels: true независимо перемешивает каналы красного, зелёного и синего для каждого пикселя, основываясь на значении шума.

// Полностью случайные цвета
this.add.noise({
    noiseRandomChannels: true
}, width * 5 / 8, height / 2, width / 4, height);

// Случайные каналы на заданном градиенте
this.add.noise({
    noiseColorStart: 0xff0000,
    noiseColorEnd: 0x00ff00,
    noiseRandomChannels: true
}, width * 7 / 8, height / 2, width / 4, height);

Во втором случае шум строится на градиенте от красного к зелёному, но каналы перемешиваются, создавая разноцветные всплески вместо плавного перехода.

Анимация шума в реальном времени

Динамика — это то, что оживляет шум. Свойства объектов шума можно менять в методе update, который вызывается каждый кадр.

update (time) {
    this.bg.noiseFlow = time / 2000;
    this.noise2.noisePower = Math.sin(time / 1000) + 1;
}

- noiseFlow смещает текстуру шума, создавая иллюзию течения (например, воды или тумана). Значение time / 2000 обеспечивает плавное, линейное движение. - noisePower анимируется с помощью синуса, пульсируя между 0 и 2. Это заставляет контраст шума ритмично увеличиваться и уменьшаться.

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

Объекты шума в Phaser — это гибкий инструмент для генерации «живых» текстур прямо в браузере. Они не нагружают сеть загрузкой изображений и могут динамически меняться в ответ на действия игрока. Для экспериментов попробуйте: связать noisePower со здоровьем персонажа для эффекта пульсации экрана, использовать шум как маску для других объектов или комбинировать несколько слоёв шума с разными скоростями noiseFlow для создания сложных атмосферных явлений.