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

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

Версия 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('poo', 'assets/sprites/poo.png');
    }

    create ()
    {
        this.add.text(10, 10, 'Scroll your mouse-wheel up and down over the sprite', { font: '16px Courier', fill: '#00ff00' });

        const poo = this.add.image(400, 300, 'poo').setInteractive();

        poo.on('wheel', function (pointer, deltaX, deltaY, deltaZ)
        {

            this.scale += deltaY * -0.001;

        });
    }
}

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

const game = new Phaser.Game(config);

Подготовка сцены и загрузка ассетов

Начнем с базовой настройки сцены. В методе preload мы устанавливаем базовый URL для загрузки ресурсов и загружаем спрайт изображения. Это стандартный подход в Phaser для подготовки ассетов перед созданием сцены.

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

Создание интерактивного объекта

В методе create мы добавляем текстовую подсказку на экран и создаем основной спрайт. Ключевой момент — метод setInteractive(). Он делает объект чувствительным к событиям ввода, без этого события мыши не будут обрабатываться. Объект poo становится интерактивным и готовым к обработке событий.

create ()
{
    this.add.text(10, 10, 'Scroll your mouse-wheel up and down over the sprite', { font: '16px Courier', fill: '#00ff00' });

    const poo = this.add.image(400, 300, 'poo').setInteractive();
}

Обработка события прокрутки колеса

На интерактивный объект мы подписываемся на событие 'wheel'. Оно срабатывает только тогда, когда курсор находится над объектом poo и пользователь вращает колесо мыши. Колбэк-функция получает параметры: pointer (объект указателя), deltaX, deltaY, deltaZ (изменения по осям). Мы используем deltaY, которая содержит значение вертикальной прокрутки.

poo.on('wheel', function (pointer, deltaX, deltaY, deltaZ)
{
    this.scale += deltaY * -0.001;
});

Внутри функции контекст this ссылается на сам объект poo (благодаря использованию обычной функции, а не стрелочной). Мы изменяем его свойство scale, добавляя к нему значение deltaY, умноженное на -0.001. Множитель -0.001 инвертирует направление (чтобы прокрутка вверх увеличивала масштаб) и делает изменение плавным. Положительное deltaY обычно означает прокрутку вниз, отрицательное — вверх.

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

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

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

const game = new Phaser.Game(config);

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

Всего несколько строк кода позволяют добавить в игру интуитивное управление колесом мыши. Этот паттерн — подписка на событие 'wheel' интерактивного объекта — универсален. Попробуйте изменить логику внутри обработчика: вращайте объект с помощью this.angle, меняйте его прозрачность (this.alpha) или переключайте кадры анимации. Можно привязать прокрутку к прокрутке списка предметов в инвентаре или регулировке силы выстрела.