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

При разработке 2D-игр с пиксельной графикой разработчики часто сталкиваются с неприятным «зубчатым» эффектом при вращении или масштабировании спрайтов. Это артефакты алиасинга, и они портят ностальгическую эстетику. Phaser предоставляет простой, но мощный механизм управления сглаживанием через настройки рендерера. В этой статье мы разберем ключевую конфигурационную опцию `smoothPixelArt` и наглядно покажем, как она превращает угловатое вращение в плавную анимацию, сохраняя при этом четкость пиксельного стиля. Это базовый, но часто упускаемый из виду аспект полировки вашей игры.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    image;

    preload ()
    {
        
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('einstein', 'assets/pics/ra-einstein.png');
    }

    create ()
    {
        this.image = this.add.image(400, 300, 'einstein');
    }

    update ()
    {
        this.image.rotation += 0.01;
        this.cameras.main.zoom = (2 + Math.sin(this.image.rotation)) * 2;
    }
}

const config = {
    type: Phaser.WEBGL,
    width: 800,
    height: 600,
    backgroundColor: '#2d2d2d',
    parent: 'phaser-example',
    scene: Example,

    // Enable the following to see aliased pixel art:
    // pixelArt: true,

    // Enable the following to see anti-aliased pixel art:
    smoothPixelArt: true
};

const game = new Phaser.Game(config);

Проблема: алиасинг при трансформациях

По умолчанию, при использовании WebGL-рендерера, Phaser применяет сглаживание (anti-aliasing) ко всем текстурам. Для большинства игр это хорошо: края выглядят мягко и естественно.

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

// Конфигурация БЕЗ специальных настроек для пиксель-арта
const config = {
    type: Phaser.WEBGL,
    pixelArt: false, // По умолчанию
    smoothPixelArt: false // По умолчанию
};

Решение: три режима отрисовки

Phaser предлагает три основных режима через свойства конфигурационного объекта config. Они взаимосвязаны и управляют тем, как текстуры фильтруются (сглаживаются) при отрисовке.

1. **Стандартный режим (по умолчанию):** И pixelArt, и smoothPixelArt равны false. Применяется билинейная фильтрация, которая размывает пиксель-арт при масштабировании и вращении. 2. **Режим четкого пиксель-арта (pixelArt: true):** Отключает любую фильтрацию текстур. Текстуры масштабируются методом ближайшего соседа (nearest-neighbor), сохраняя резкие пиксели. Но при вращении края будут сильно «зубчатыми» (алиасинг). 3. **Режим плавного пиксель-арта (smoothPixelArt: true):** Это «золотая середина». Phaser автоматически устанавливает pixelArt: true, но использует специальный режим фильтрации, который сохраняет четкость цвета пикселей, при этом сглаживая геометрические края при трансформациях.

// Режим 2: Четкий, но угловатый пиксель-арт
pixelArt: true,

// Режим 3: Плавный пиксель-арт (РЕКОМЕНДУЕТСЯ)
smoothPixelArt: true

**Важно:** При активации smoothPixelArt флаг pixelArt автоматически становится true. Не нужно указывать оба.

Разбор примера: вращение и динамический зум

В предоставленном примере настройки применяются мгновенно ко всем текстурам в игре. Давайте посмотрим на сцену.

В preload загружается обычное изображение. В create оно добавляется в центр экрана.

create ()
{
    this.image = this.add.image(400, 300, 'einstein');
}

Магия происходит в update. Каждый кадр спрайт поворачивается, а зум камеры плавно пульсирует, используя синусоиду.

update ()
{
    this.image.rotation += 0.01;
    this.cameras.main.zoom = (2 + Math.sin(this.image.rotation)) * 2;
}

Без smoothPixelArt: true эти непрерывные трансформации привели бы либо к сильному алиасингу (в стандартном режиме), либо к грубым «лесенкам» на краях (в режиме pixelArt: true). С включенной опцией вращение и масштабирование выглядят плавно, а основные цвета изображения остаются чистыми и не размываются.

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

Используйте smoothPixelArt: true для любых проектов в стиле пиксель-арт, где спрайты или тайлсеты будут подвергаться плавным трансформациям: вращению, нецелочисленному масштабированию, наклону.

const config = {
    type: Phaser.WEBGL,
    width: 800,
    height: 600,
    scene: Example,
    smoothPixelArt: true // Включаем плавный пиксель-арт
};

**Ограничения:** 1. Опция работает только с WebGL-рендерером (type: Phaser.WEBGL). В Canvas-режиме она не даст эффекта. 2. Она влияет на фильтрацию всех текстур в игре. Если вам нужно смешивать стили (например, четкий UI и плавных персонажей), потребуется более сложный подход с кастомными шейдерами или отдельными текстурами. 3. Для статичной пиксельной графики (например, тайловой карты без трансформаций) достаточно стандартного режима pixelArt: true.

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

Настройка smoothPixelArt: true — это простейший способ значительно повысить визуальное качество пиксель-арт игры, если в ней есть анимации с поворотом или плавным изменением масштаба. Она решает классический конфликт между желанием сохранить «квадратный» пиксельный стиль и необходимостью плавного движения. **Идеи для экспериментов:** 1. Создайте сцену с несколькими спрайтами и примените к ним разные типы трансформаций (rotation, scaleX/Y, angle). Сравните результат с тремя режимами рендерера. 2. Попробуйте использовать smoothPixelArt с тайлсетами. Создайте карту и плавно зумируйте камеру. Обратите внимание, как ведут себя края тайлов. 3. Исследуйте, как эта настройка сочетается с эффектами постобработки, доступными в Phaser 3.