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

Создание комбинаций клавиш — частый запрос в играх для активации спецспособностей, читов или скрытых действий. Однако стандартное поведение Phaser таково, что после успешного совпадения комбинацию нужно вводить заново с первого символа. В этой статье мы разберем, как использовать опцию `resetOnMatch`, чтобы игрок мог непрерывно вводить одну и ту же комбинацию, например, для быстрого повторного применения умения.

Версия Phaser: код и демо в этой статье рассчитаны на Phaser 3.90.0.

Живой запуск

Ниже встроен рабочий билд примера. Оригинальный источник: GitHub.

Исходный код


class Example extends Phaser.Scene
{
    create ()
    {

        //  Here we'll create a simple key combo
        //  When you type in ABC the event will be triggered on the entry of the final character (C)
        //  An incorrect key press will reset the combo back to the start again
        //  The extra config option allows you to trigger this combo as many times as you like, by typing ABC ABC ABC repeatedly

        const combo = this.input.keyboard.createCombo('ABC', { resetOnMatch: true });

        this.input.keyboard.on('keycombomatch', event =>
        {

            console.log('Key Combo matched!');

        });

    }
}

const config = {
    type: Phaser.CANVAS,
    parent: 'phaser-example',
    scene: Example
};

const game = new Phaser.Game(config);

Проблема одноразовой комбинации

По умолчанию, созданная через this.input.keyboard.createCombo() последовательность клавиш срабатывает один раз, после чего система ожидает нового полного ввода. Это неудобно, если действие нужно повторять часто.

Например, для комбинации 'FIRE' игроку после каждого успешного ввода придется снова нажимать F, I, R, E. Мы хотим, чтобы после 'FIRE' система сразу была готова принять новое 'FIRE', не требуя паузы или дополнительных действий.

Решение: параметр resetOnMatch

Phaser позволяет задать поведение комбинации при создании. Второй аргумент метода createCombo — объект конфигурации. Ключевая опция — resetOnMatch.

- Если resetOnMatch: false (значение по умолчанию), комбинация деактивируется после совпадения. - Если resetOnMatch: true, комбинация автоматически сбрасывается в начальное состояние сразу после успешного совпадения. Это позволяет вводить её снова без задержки.

Создадим комбинацию с этой опцией:

const combo = this.input.keyboard.createCombo('ABC', { resetOnMatch: true });

Обработка события совпадения

Для реакции на успешный ввод комбинации нужно подписаться на событие keycombomatch у клавиатурного ввода. Событие сработает в момент, когда будет нажат последний символ комбинации (в нашем случае 'C').

В обработчике события можно, например, наносить урон, восстанавливать здоровье или выводить отладочную информацию.

Настроим слушатель:

this.input.keyboard.on('keycombomatch', event => {
    console.log('Key Combo matched!');
});

Важно: событие будет срабатывать каждый раз при полном и правильном вводе последовательности 'ABC', даже если она вводится подряд несколько раз.

Как это работает внутри

При resetOnMatch: true внутренний счётчик совпавших символов обнуляется сразу после генерации события keycombomatch. Система снова начинает 'слушать' первый символ комбинации.

Если игрок ошибётся и нажмёт не ту клавишу в середине последовательности (например, 'ABX' вместо 'ABC'), комбинация также сбросится, и ввод нужно будет начинать с 'A'. Это стандартное поведение, которое не меняется опцией resetOnMatch.

Что попробовать дальше

Опция resetOnMatch: true — простой и эффективный способ сделать ввод клавиатурных комбинаций более отзывчивым и удобным для игрока. Это особенно полезно для способностей с коротким временем перезарядки или для активации повторяющихся эффектов. Идеи для экспериментов: 1. Создайте несколько комбинаций с разными настройками resetOnMatch и отслеживайте их в консоли. 2. Попробуйте привязать комбинацию к визуальному эффекту (например, вспышке на экране) для лучшей обратной связи. 3. Реализуйте систему 'чит-кодов', где длинная комбинация (например, 'IDDQD') активирует бессмертие и сбрасывается только после перезапуска уровня.