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

Создание интерактивных элементов — ключ к увлекательному геймплею. В этой статье мы разберем, как в Phaser сделать спрайт отзывчивым на действия игрока: например, чтобы он менял анимацию при наведении курсора. Этот простой прием мгновенно улучшает обратную связь и оживляет игровой мир. На примере классического спрайтлиста из набора примеров Phaser мы реализуем реакцию спрайта на события `pointerover` (наведение) и `pointerout` (уход курсора). Вы научитесь загружать листы спрайтов, создавать интерактивные объекты и управлять их кадрами в реальном времени.

Версия 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.spritesheet('aliens', 'assets/sprites/bsquadron-enemies.png', { frameWidth: 192, frameHeight: 160 });
    }

    create ()
    {
        const alien = this.add.sprite(400, 300, 'aliens', 0).setInteractive();

        alien.on('pointerover', function ()
        {

            this.setFrame(3);

        });

        alien.on('pointerout', function ()
        {

            this.setFrame(0);

        });
    }
}

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

const game = new Phaser.Game(config);

Загрузка листа спрайтов (spritesheet)

Перед созданием любого графического объекта его ресурсы необходимо загрузить в память. Для анимированных персонажей или объектов с несколькими состояниями идеально подходит спрайтлист (spritesheet) — единое изображение, содержащее все кадры.

В методе preload() мы используем this.load.spritesheet(). Ключевые параметры: - Ключ 'aliens' для обращения к ресурсу в коде. - Путь к файлу изображения. - Объект конфигурации, где frameWidth и frameHeight задают размер одного кадра.

this.load.spritesheet('aliens', 'assets/sprites/bsquadron-enemies.png', { frameWidth: 192, frameHeight: 160 });

Указав размер кадра, Phaser автоматически «нарежет» изображение на отдельные фреймы, к которым можно обращаться по индексу, начиная с 0.

Создание интерактивного спрайта

Чтобы спрайт реагировал на мышь или касание, его необходимо сделать интерактивным. В методе create() мы создаем объект спрайта и сразу же вызываем для него метод .setInteractive().

const alien = this.add.sprite(400, 300, 'aliens', 0).setInteractive();

Разберем аргументы метода this.add.sprite(): - Координаты X=400 и Y=300 — позиция центра спрайта на сцене. - Ключ текстуры 'aliens', который мы загрузили ранее. - Индекс кадра `0` — отображаемый по умолчанию кадр из спрайтлиста.

Вызов .setInteractive() без параметров делает активной всю прямоугольную область спрайта. Теперь объект alien может генерировать события указателя.

Обработка событий наведения курсора

Ядро интерактивности — подписка на события. Мы используем метод .on() для прослушивания двух событий: - pointerover: срабатывает, когда курсор заходит на область спрайта. - pointerout: срабатывает, когда курсор покидает область спрайта.

alien.on('pointerover', function () {
    this.setFrame(3);
});

Внутри функции-обработчика контекст this ссылается на сам спрайт (alien). Метод this.setFrame(3) мгновенно меняет отображаемый кадр на тот, что имеет индекс 3 в спрайтлисте (например, кадр с «ожившим» пришельцем).

alien.on('pointerout', function () {
    this.setFrame(0);
});

Аналогично, при уходе курсора мы возвращаем исходный кадр с индексом 0. Эта простая логика создает базовый эффект hover, знакомый по веб-интерфейсам.

Конфигурация и запуск игры

Весь интерактивный функционал работает внутри сцены (Scene). Сцена должна быть передана в основную конфигурацию игры.

const config = {
    type: Phaser.AUTO,
    parent: 'phaser-example',
    width: 800,
    height: 600,
    scene: Example // Наша класс-сцена
};

const game = new Phaser.Game(config);

Объект config определяет основные параметры: тип рендерера (Phaser.AUTO выбирает WebGL или Canvas), HTML-контейнер для игры, ее размеры и главную сцену. Создание экземпляра Phaser.Game с этой конфигурацией инициализирует игровой цикл.

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

Всего несколько строк кода — и статичный спрайт превращается в отзывчивый игровой объект. Механика реакции на курсор — фундамент для сложных UI-элементов, интерактивных персонажей и визуальных подсказок. Для экспериментов попробуйте: 1. Использовать метод .setTint() внутри обработчиков для временного окрашивания спрайта. 2. Добавить событие pointerdown для реакции на клик. 3. Вместо смены кадра запустить предзагруженную анимацию с помощью this.play().