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

Создание сложных механик в играх часто требует от игрока выполнения последовательных действий. Ввод комбинаций клавиш — классический пример, будь то спецприёмы в файтинге или активация способностей. 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. Свяжите успешный ввод комбинации не с выводом в консоль, а с визуальным эффектом на экране или усилением персонажа.