О чем этот пример
Клеточный шум (Cellular Noise) — мощный инструмент для генерации procedural-текстур, который часто используется для создания фонов, ландшафтов или абстрактных визуальных эффектов. В отличие от простого случайного шума, он генерирует структуры, похожие на ячейки, пузыри или живые ткани. В Phaser есть встроенный Game Object `noisecell2d`, который делает эту генерацию невероятно простой. В этой статье мы разберем, как управлять степенью сглаживания этих ячеек, чтобы получать как резкие пиксельные паттерны, так и плавные органические переходы, идеальные для атмосферных фонов игр.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
create()
{
const { width, height } = this.scale;
this.add.noisecell2d({
noiseCells: [ 8, 9 ],
noiseColorStart: 0xffcc66,
noiseColorEnd: 0x442288
}, width / 4, height / 2, width / 2, height);
this.add.noisecell2d({
noiseCells: [ 8, 9 ],
noiseColorStart: 0xccff66,
noiseColorEnd: 0x662266,
noiseSmoothing: 2,
noiseMode: 2 // Render cells with smooth intersections.
}, width * 3 / 4, height / 2, width / 2, height);
}
}
const config = {
type: Phaser.WEBGL,
parent: 'phaser-example',
width: 1280,
height: 720,
scene: Example
};
const game = new Phaser.Game(config);
Создание базового клеточного шума
Объект noisecell2d добавляется через фабрику this.add. Его основной конфиг определяет ключевые визуальные параметры.
this.add.noisecell2d({
noiseCells: [ 8, 9 ],
noiseColorStart: 0xffcc66,
noiseColorEnd: 0x442288
}, width / 4, height / 2, width / 2, height);
Здесь мы создаем объект шума. Параметр noiseCells задает количество ячеек по осям X и Y — в данном случае 8 на 9. noiseColorStart и noiseColorEnd определяют градиент цветов для раскраски ячеек. Последние четыре аргумента метода задают позицию (X, Y) и размеры (width, height) объекта на экране. Без параметров сглаживания границы между ячейками будут резкими.
Включаем сглаживание: noiseSmoothing и noiseMode
Чтобы сделать переходы между ячейками мягкими, используются два специальных параметра.
this.add.noisecell2d({
noiseCells: [ 8, 9 ],
noiseColorStart: 0xccff66,
noiseColorEnd: 0x662266,
noiseSmoothing: 2,
noiseMode: 2 // Render cells with smooth intersections.
}, width * 3 / 4, height / 2, width / 2, height);
Параметр noiseSmoothing принимает целочисленные значения (обычно от 0 до 5). Чем выше значение, тем более размытыми и плавными становятся границы ячеек. noiseMode: 2 — это ключ к активации алгоритма рендеринга, который вычисляет плавные пересечения между ячейками. Без этого режима параметр noiseSmoothing не даст желаемого эффекта. Вместе они превращают сетку из цветных многоугольников в текучую, похожую на мрамор или дымку, текстуру.
Практическое применение в играх
Такой сглаженный шум не требует ресурсоемких вычислений на GPU и является готовым игровым объектом. Его можно использовать как динамический фон для меню или космической карты.
// Создание фона на весь экран
const backgroundNoise = this.add.noisecell2d({
noiseCells: [ 20, 15 ],
noiseColorStart: 0x001133,
noiseColorEnd: 0x336699,
noiseSmoothing: 3,
noiseMode: 2
}, 0, 0, width, height);
Установив объекту noisecell2d координаты (0,0) и размеры, равные размерам камеры, вы получите полноэкранный фон. Поэкспериментируйте с увеличением количества ячеек (noiseCells) вместе со сглаживанием — это создаст более мелкозернистую и сложную текстуру, идеальную для симуляции облаков, воды или неоднородного освещения.
Советы по настройке и производительности
Помните, что объект noisecell2d использует WebGL. Основные параметры, влияющие на сложность рендеринга, — это количество ячеек (noiseCells) и уровень сглаживания (noiseSmoothing).
// Пример тяжелой конфигурации (используйте с осторожностью)
{
noiseCells: [ 50, 50 ],
noiseSmoothing: 5,
noiseMode: 2
}
Для статичного фона можно позволить более высокие значения. Если же вы планируете анимировать параметры (например, цвет или позицию) в реальном времени, стоит выбрать умеренные настройки, чтобы не нагружать рендер-цикл. Анимация достигается просто через обновление свойств объекта в методе update() сцены.
Что попробовать дальше
Game Object noisecell2d в Phaser — это быстрый и гибкий способ наполнить вашу игру уникальными процедурными текстурами. Сочетание параметров noiseSmoothing и noiseMode открывает путь от строгого клеточного паттерна до мягких абстрактных форм. Для экспериментов попробуйте анимировать свойства noiseColorStart и noiseColorEnd для создания эффекта плавного цветового перехода или динамически менять noiseCells для "кипящей", живой текстуры фона.
