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

Формат WebP предлагает отличное качество изображений при меньшем размере файла по сравнению с PNG или JPEG. Это напрямую влияет на скорость загрузки вашей игры и экономию трафика для пользователей. В Phaser 3 загрузка WebP-изображений ничем не отличается от работы с любыми другими форматами — движок автоматически определяет и обрабатывает их. В этой статье мы разберем базовый пример и посмотрим, как просто интегрировать современные форматы в ваш игровой проект.

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

Живой запуск

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

Исходный код


class Example extends Phaser.Scene
{
    preload ()
    {
        this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
        this.load.image('background', 'assets/tests/background.webp');
    }

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

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Настройка базового URL

Первым шагом в методе preload мы устанавливаем базовый URL для всех загружаемых ресурсов. Это удобно, если ваши ассеты хранятся на удаленном сервере или в конкретной папке. Вы указываете корневой путь один раз, а в методах загрузки указываете только относительные пути.

this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');

Этот вызов предваряет все последующие пути к файлам. В нашем примере полный путь к изображению составит указанный URL плюс относительный путь assets/tests/background.webp.

Загрузка WebP-изображения

Непосредственная загрузка изображения выполняется с помощью метода this.load.image. Phaser 3 не требует специальных указаний на формат WebP — он определяется автоматически по расширению файла.

this.load.image('background', 'assets/tests/background.webp');

Здесь 'background' — это внутренний ключ (key), по которому изображение будет доступно в коде игры. Второй аргумент — путь к файлу относительно установленного базового URL. После выполнения этого кода в методе preload изображение будет загружено в кэш.

Создание и отображение спрайта

Когда все ресурсы загружены, управление передается методу create. Здесь мы создаем и размещаем спрайт на сцене, используя загруженное изображение.

this.add.image(400, 300, 'background');

Метод this.add.image создает новый игровой объект Image. Первые два аргумента (400, 300) — это координаты X и Y для центра изображения на холсте. Третий аргумент ('background') — это тот самый ключ, который мы указали при загрузке. Phaser берет готовую текстуру из кэша и отрисовывает ее.

Конфигурация игры

Весь пример завершается стандартной конфигурацией экземпляра игры Phaser.Game. В конфиге указывается сцена, размеры холста и элемент DOM для встраивания.

const config = {
    type: Phaser.AUTO,
    width: 800,
    height: 600,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Phaser.AUTO автоматически выбирает рендерер (WebGL или Canvas). Свойства width и height задают размер игрового поля. parent — это ID HTML-элемента, в который будет встроен холст. scene принимает класс нашей сцены Example, которая будет запущена сразу после инициализации игры.

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

Как видите, Phaser 3 полностью абстрагирует работу с форматами изображений — процесс загрузки WebP идентичен работе с PNG. Для экспериментов попробуйте загрузить несколько изображений в разных форматах (WebP, PNG, JPEG) и сравните итоговый размер билда вашей игры. Также вы можете реализовать условную логику в preload, чтобы загружать WebP там, где браузер его поддерживает, и PNG в качестве фолбека для старых браузеров.