Итак, предположим, что у вас есть система ввода, основанная на опросе
void update()
{
if( Keyboard[ 'A' ] )
// A is down
}
Скажем, вы хотите иметь возможность распознавать комбинации клавиш длиной от 3 до 8 (например, вниз, вниз, вперед, вперед, A для хадо-кена)
Как бы вы лучше всего создали общую (легко модифицируемую / программируемую) комбинацию клавиш ввода при опросе ?
Один из способов - сохранить текущее и предыдущее состояния ввода и сравнивать их каждый раз при опросе ввода.
Для каждой клавиши, которая может быть нажата, сохраните объект, который имеет временную метку последнего времени, когда клавиша переключалась из состояния «вниз» в состояние «вверх».
Обновите эти объекты, выполняя это при каждом опросе:
Теперь вы можете сопоставлять свои комбинации с содержимым
keys
.Иметь комбо-объект для каждого комбо и вызывать update () для каждого комбо-объекта при каждом опросе.
Метод update () объекта combo будет соответствовать шаблону combo, проверяя, выполнены ли все необходимые условия для combo в этом опросе. Т.е. все временные метки клавиш для комбо пока находятся в порядке, и никакая другая клавиша, которая могла бы нарушить комбо, не была нажата в этом кадре Для каждого выполненного условия увеличивайте счетчик в комбинированном объекте до следующего проверяемого условия. Когда все условия выполнены в комбо, вызовите метод, который должен выполнить комбо. Если
some_key_has_been_pressed == true
только клавиша, которая является следующим условием для комбинации, не была нажата, тогда сбросьте счетчик удовлетворенных условий комбинации на 0.Вышеуказанный метод является моим предпочтительным, так как он прост в реализации, прост в обслуживании, эффективен и обладает высокой модульностью.
Однако, для другого хорошего метода, посмотрите образец входной последовательности XNA , который написан на C #, и логика, вероятно, переносима на язык, который вы используете.
источник
if(current_input[key].down){
не хотите ли вы также проверить, был ли ключ вprevious_input
состоянии? Как написано, я думаю, что это будет постоянно обновлять удерживаемый ключdown_timestamp
.Создайте стек последних X-событий клавиш, для каждого ключевого события добавьте объект с ключом и временем нажатия / выпуска, затем проверьте, соответствуют ли последние члены стека специальному шаблону и достаточно ли быстро нажимались эти клавиши, чтобы считать как комбинацию. Наконец удалите самый старый объект из стека.
источник