О чем этот пример
Создание отзывчивых игровых объектов — ключ к вовлечению игрока. Обработка событий ввода, например движения курсора, позволяет элементам игры мгновенно реагировать на действия пользователя. В этой статье мы разберем, как легко "подписаться" на событие движения мыши над спрайтом и менять его внешний вид в реальном времени, используя встроенную систему событий Phaser. Этот простой прием открывает путь к созданию интерактивных интерфейсов, подсветке объектов и динамической обратной связи.
Версия 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('eye', 'assets/pics/lance-overdose-loader-eye.png');
}
create ()
{
const sprite = this.add.sprite(400, 300, 'eye').setInteractive();
sprite.on('pointermove', function (pointer)
{
this.setTint(Math.random() * 16000000);
});
}
}
const config = {
type: Phaser.WEBGL,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Подготовка сцены и создание интерактивного спрайта
Первым делом в методе preload мы загружаем изображение, которое станет нашим спрайтом. Важно установить базовый URL для загрузчика, чтобы указать относительный путь к ресурсу.
preload ()
{
this.load.setBaseURL('https://raw.githubusercontent.com/phaserjs/examples/master/public/');
this.load.image('eye', 'assets/pics/lance-overdose-loader-eye.png');
}
В методе create мы создаем сам спрайт, размещая его в центре сцены (координаты x=400, y=300), и делаем его интерактивным. Без вызова метода setInteractive() объект не будет генерировать события ввода.
create ()
{
const sprite = this.add.sprite(400, 300, 'eye').setInteractive();
}
Подписка на событие pointermove
Ядро механики — метод on(), который регистрирует обработчик события для игрового объекта. Событие 'pointermove' генерируется каждый раз, когда курсор (или касание) перемещается над интерактивной областью спрайта.
sprite.on('pointermove', function (pointer)
{
// Код обработчика выполнится здесь
});
Обратите внимание: внутри функции-обработчика контекст this указывает на сам спрайт, к которому привязано событие. Это позволяет напрямую вызывать его методы, такие как setTint.
Динамическое изменение цвета (тинтование)
Внутри обработчика мы меняем цвет спрайта (применяем тинт) с помощью метода setTint. В качестве значения передается случайное целое число, полученное умножением Math.random() на 16000000. Это стандартный для Phaser способ задания цвета в виде десятичного числа (hex color).
this.setTint(Math.random() * 16000000);
Каждый раз, когда игрок двигает мышью над спрайтом, выполняется эта строка, присваивая ему новый случайный оттенок. Это создает эффект "мерцания" или "подсветки" в реальном времени.
Инициализация игры
Весь функционал упакован в сцену Example. Для запуска игры мы создаем конфигурационный объект, где указываем тип рендерера, родительский HTML-элемент и нашу сцену. Затем инстанцируем объект Phaser.Game с этой конфигурацией.
const config = {
type: Phaser.WEBGL,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Именно этот код инициирует весь цикл жизни игры: прелоад, создание объектов и запуск основного игрового цикла.
Что попробовать дальше
Всего несколько строк кода — и ваш спрайт оживает, реагируя на движение курсора. Встроенная система событий Phaser (on) делает такие взаимодействия простыми и эффективными. Для экспериментов попробуйте вместо случайного тинта: плавно изменять масштаб спрайта с помощью setScale, вращать его свойством rotation или перемещать, изменяя координаты `xиyв зависимости от положения указателяpointer`. Это основа для создания сложных реакций на действия игрока.
