О чем этот пример
Обработка ввода с клавиатуры — фундамент для управления в игре. Часто нужно реагировать на конкретные клавиши, используя `this.input.keyboard.addKey()`. Но что, если вашей логике требуется знать о *любом* нажатии, независимо от клавиши? Например, для системных вызовов, паузы, скриншотов или отладки. В этой статье разберем, как использовать глобальное событие `keydown` в Phaser. Этот подход полезен, когда нужно перехватить все нажатия, чтобы обработать их централизованно, до или вместо конкретных обработчиков клавиш.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
create ()
{
// Receives every single key down event, regardless of origin or key
this.input.keyboard.on('keydown', event =>
{
console.dir(event);
});
}
}
const config = {
type: Phaser.CANVAS,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
В чем разница: глобальное событие vs. обработка конкретной клавиши
Обычно в Phaser управление привязывают к конкретным клавишам. Вы создаете объект ключа и слушаете его состояние.
// Стандартный способ: отслеживание конкретной клавиши (Пробел)
const spaceBar = this.input.keyboard.addKey(Phaser.Input.Keyboard.KeyCodes.SPACE);
if (spaceBar.isDown) {
// Персонаж прыгает
}
Глобальное событие keydown работает иначе. Оно срабатывает при *любом* нажатии клавиши на клавиатуре и передает объект события. Это не заменяет стандартное управление, а дополняет его для особых случаев, где важнее факт нажатия, а не конкретная клавиша.
Как подключить глобальный слушатель keydown
Подписка на событие делается через свойство keyboard объекта this.input. Используйте метод on().
create () {
// Получаем каждое событие keydown, независимо от источника или клавиши
this.input.keyboard.on('keydown', event => {
console.dir(event);
});
}
Ключевой момент: колбэк-функция выполнится для каждого нажатия. Параметр event — это нативный объект события клавиатуры (KeyboardEvent), содержащий всю информацию: код клавиши (event.code), символ (event.key), были ли зажаты модификаторы (Shift, Ctrl) и так далее.
Что внутри объекта события (event) и как это использовать
Объект event — ваш основной источник информации. Его полезные свойства для игровой логики:
* event.key: Символ клавиши (например, 'a', 'ArrowUp', ' ' для пробела). Учитывает раскладку (для одной физической клавиши может быть разный символ).
* event.code: Физический код клавиши, не зависящий от раскладки (например, 'KeyA', 'ArrowUp', 'Space'). Надежнее для управления.
* event.ctrlKey, event.shiftKey, event.altKey: Флаги, показывающие, были ли нажаты соответствующие модификаторы.
this.input.keyboard.on('keydown', event => {
// Пример: делаем скриншот по комбинации Ctrl + S
if (event.key === 's' && event.ctrlKey) {
this.game.renderer.snapshot((image) => {
// ... обработка изображения
});
}
// Пример: пауза игры по нажатию на любую клавишу из списка
const pauseKeys = ['Escape', 'KeyP', 'p'];
if (pauseKeys.includes(event.code) || pauseKeys.includes(event.key)) {
this.scene.pause();
}
});
Важные нюансы и предостережения
1. **Один слушатель на сцену**: Не создавайте множество слушателей keydown в одном create(). Это может привести к дублированию обработки. Одного достаточно.
2. **Не для основного геймплея**: Для платформера или шутера используйте addKey. Глобальный keydown может быть менее отзывчивым для быстрых повторных нажатий (из-за задержок автоповтора ОС).
3. **Остановка распространения**: Внутри обработчика можно вызвать event.stopPropagation(), чтобы предотвратить дальнейшую обработку события браузером (например, прокрутку страницы при нажатии пробела).
this.input.keyboard.on('keydown', event => {
// Запрещаем прокрутку страницы пробелом и стрелками в нашей игре
if (['Space', 'ArrowUp', 'ArrowDown'].includes(event.code)) {
event.preventDefault();
event.stopPropagation();
}
// Далее ваша игровая логика...
});
Что попробовать дальше
Глобальный обработчик keydown — мощный инструмент для системных и отладочных функций в вашей игре на Phaser. Он идеально подходит для перехвата комбинаций клавиш (Ctrl+S, Alt+Enter), активации читов через ввод последовательности символов или создания интерактивной консоли отладки.
**Идеи для экспериментов:**
1. Создайте систему "быстрых сохранений" на F5-F9.
2. Реализуйте активацию бонусов ("god mode") по секретному слову, вводимому с клавиатуры.
3. Сделайте переключение графических режимов или overlay статистики по нажатию тильды (`).
