Phaser предоставляет встроенную поддержку работы с геймпадами через
Gamepad Plugin, доступный через объект
this.input.gamepad в сцене. Для начала работы необходимо
убедиться, что плагин активирован (он включён по умолчанию в Phaser 3) и
что подключение контроллера отслеживается:
this.input.gamepad.once('connected', function (pad) {
console.log('Геймпад подключен:', pad.id);
});
Событие 'connected' срабатывает при подключении нового
контроллера. Внутри обработчика доступен объект pad типа
Phaser.Input.Gamepad.Gamepad, содержащий информацию о
кнопках, стиках и состоянии подключения.
Для проверки наличия геймпадов в любой момент можно использовать
массив this.input.gamepad.gamepads, который содержит все
подключенные устройства. Неиспользуемые элементы в массиве будут равны
null.
Объект Gamepad предоставляет несколько ключевых свойств:
Phaser.Input.Gamepad.Button, отражающих состояние каждой
кнопки.'standard' или
нестандартная, указывающая на тип схемы кнопок.Объект кнопки имеет свойства:
Для отслеживания нажатий кнопок Phaser предоставляет два подхода:
update() {
const pad = this.input.gamepad.getPad(0);
if (pad) {
if (pad.buttons[0].pressed) {
console.log('Нажата кнопка A');
}
}
}
'down' — срабатывает при нажатии кнопки.'up' — при отпускании.'axis' — при изменении положения стика.Пример:
this.input.gamepad.on('down', function (pad, button, index) {
console.log(`Кнопка ${index} нажата`);
});
События позволяют реагировать на действия мгновенно, без постоянной
проверки состояния кнопок в update.
Стики представлены как массив чисел axes, где:
axes[0] и axes[1] — горизонтальная и
вертикальная ось левого стика.axes[2] и axes[3] — оси правого
стика.Значения изменяются от -1 до 1, при
этом 0 соответствует нейтральному положению. Для плавного
управления объектами в игре удобно использовать мёртвую
зону, чтобы игнорировать незначительные смещения стика:
const deadZone = 0.2;
const x = Math.abs(pad.axes[0].getValue()) > deadZone ? pad.axes[0].getValue() : 0;
const y = Math.abs(pad.axes[1].getValue()) > deadZone ? pad.axes[1].getValue() : 0;
player.x += x * player.speed;
player.y += y * player.speed;
Phaser позволяет работать с несколькими контроллерами одновременно.
Каждый новый контроллер добавляется в массив
this.input.gamepad.gamepads. Для получения конкретного
геймпада используют метод getPad(index):
const pad1 = this.input.gamepad.getPad(0);
const pad2 = this.input.gamepad.getPad(1);
Для разделения действий игроков можно назначить каждому геймпаду собственные обработчики событий.
true, если кнопка нажата.duration
миллисекунд).Эти методы упрощают обработку событий без постоянной проверки состояния кнопок и стиков вручную.
Пример управления персонажем с геймпадом:
update() {
const pad = this.input.gamepad.getPad(0);
if (!pad) return;
const speed = 200;
let dx = 0;
let dy = 0;
dx = Math.abs(pad.axes[0].getValue()) > 0.1 ? pad.axes[0].getValue() : 0;
dy = Math.abs(pad.axes[1].getValue()) > 0.1 ? pad.axes[1].getValue() : 0;
player.x += dx * speed * this.game.loop.delta / 1000;
player.y += dy * speed * this.game.loop.delta / 1000;
if (pad.isButtonDown(0)) {
player.jump();
}
}
В этом примере учтена плавная обработка осей, а действия кнопок и стиков интегрированы с игровым циклом.
mapping позволяет корректно
обрабатывать стандартные кнопки без привязки к конкретному
устройству.Gamepad API в Phaser обеспечивает гибкое управление, позволяя реализовать поддержку различных контроллеров с минимальными затратами на код и обеспечивая плавный отклик игрока.