О чем этот пример
Создание сложных механик в играх часто требует от игрока выполнения последовательных действий. Ввод комбинаций клавиш — классический пример, будь то спецприёмы в файтинге или активация способностей. Phaser предоставляет мощный встроенный инструмент для отслеживания таких последовательностей — `KeyboardPlugin.createCombo()`. В этой статье разберём, как использовать параметр `maxKeyDelay` для контроля скорости ввода комбинации, чтобы игра реагировала только на быстрые и точные действия игрока.
Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.
Живой запуск
Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.
Исходный код
class Example extends Phaser.Scene
{
create ()
{
// They get 1 second to press the next key in the combo, or it resets
const combo = this.input.keyboard.createCombo('phaser', { maxKeyDelay: 1000 });
this.input.keyboard.on('keycombomatch', event =>
{
console.log('You typed phaser quickly!');
});
}
}
const config = {
type: Phaser.CANVAS,
parent: 'phaser-example',
scene: Example
};
const game = new Phaser.Game(config);
Создание комбинации клавиш
Основой работы с комбинациями в Phaser является метод createCombo() объекта клавиатуры (this.input.keyboard). Первым аргументом он принимает строку с последовательностью символов, которую нужно отследить.
const combo = this.input.keyboard.createCombo('phaser');
Приведённый код создаёт слушатель, который будет ждать, пока игрок наберёт на клавиатуре слово 'p', 'h', 'a', 's', 'e', 'r' именно в такой последовательности. Однако по умолчанию система ждёт неограниченно долго между нажатиями. Для динамичных игр это неприемлемо — нам нужно ограничение по времени.
Контроль скорости: параметр maxKeyDelay
Вторым аргументом createCombo() можно передать объект конфигурации. Ключевой параметр для контроля темпа — maxKeyDelay. Он определяет максимально допустимую паузу (в миллисекундах) между нажатиями двух соседних клавиш в комбинации.
const combo = this.input.keyboard.createCombo('phaser', { maxKeyDelay: 1000 });
Эта настройка даёт игроку ровно 1 секунду (1000 мс) на то, чтобы нажать следующую правильную клавишу после предыдущей. Если пауза превысит это значение, счётчик комбинации сбросится к началу, и игроку придётся вводить последовательность заново, начиная с первой буквы.
Обработка успешного совпадения
Чтобы отреагировать на успешно введённую комбинацию, нужно подписаться на событие keycombomatch клавиатурного ввода. Это событие генерируется, когда игрок завершает всю последовательность в пределах заданных ограничений (в нашем случае — укладываясь в maxKeyDelay между нажатиями).
this.input.keyboard.on('keycombomatch', event => {
console.log('You typed phaser quickly!');
});
Обработчик события keycombomatch выполнится только тогда, когда слово 'phaser' будет напечатано быстро и без ошибок. Объект event, передаваемый в функцию, содержит полезную информацию, например, саму совпавшую комбинацию.
Полный пример сцены
Соберём всё вместе в рамках сцены Phaser. Код создаёт комбинацию с ограничением по времени и выводит сообщение в консоль при её успешном вводе.
class Example extends Phaser.Scene {
create () {
// Игроку даётся 1 секунда на нажатие следующей клавиши в комбинации, иначе она сбросится
const combo = this.input.keyboard.createCombo('phaser', { maxKeyDelay: 1000 });
this.input.keyboard.on('keycombomatch', event => {
console.log('You typed phaser quickly!');
});
}
}
Инициализация игры с этой сценой происходит стандартным образом через объект конфигурации.
Что попробовать дальше
Использование createCombo() с параметром maxKeyDelay позволяет легко и эффективно внедрить в игру механики, требующие от игрока быстрого и точного ввода последовательностей. Это основа для спецприёмов, читов (ввод кодов) или сложных действий.
**Идеи для экспериментов:**
1. Создайте несколько комбинаций с разным maxKeyDelay для простых и сложных приёмов.
2. Используйте свойство event в обработчике, чтобы различать, какая именно комбинация была введена, и активировать разные способности.
3. Свяжите успешный ввод комбинации не с выводом в консоль, а с визуальным эффектом на экране или усилением персонажа.
