Один из способов - сохранить текущее и предыдущее состояния ввода и сравнивать их каждый раз при опросе ввода.
Для каждой клавиши, которая может быть нажата, сохраните объект, который имеет временную метку последнего времени, когда клавиша переключалась из состояния «вниз» в состояние «вверх».
Обновите эти объекты, выполняя это при каждом опросе:
void update(){
some_key_has_been_pressed = false;
foreach(key in keys){
if(previous_input[key].Down && current_input[key].Up){
keys[key].up_timestamp = current_time();
}
if(current_input[key].Down){
keys[key].down_timestamp = current_time();
some_key_has_been_pressed = true;
}
}
}
Теперь вы можете сопоставлять свои комбинации с содержимым keys
.
Иметь комбо-объект для каждого комбо и вызывать update () для каждого комбо-объекта при каждом опросе.
Метод update () объекта combo будет соответствовать шаблону combo, проверяя, выполнены ли все необходимые условия для combo в этом опросе. Т.е. все временные метки клавиш для комбо пока находятся в порядке, и никакая другая клавиша, которая могла бы нарушить комбо, не была нажата в этом кадре Для каждого выполненного условия увеличивайте счетчик в комбинированном объекте до следующего проверяемого условия. Когда все условия выполнены в комбо, вызовите метод, который должен выполнить комбо. Если some_key_has_been_pressed == true
только клавиша, которая является следующим условием для комбинации, не была нажата, тогда сбросьте счетчик удовлетворенных условий комбинации на 0.
Вышеуказанный метод является моим предпочтительным, так как он прост в реализации, прост в обслуживании, эффективен и обладает высокой модульностью.
Однако, для другого хорошего метода, посмотрите образец входной последовательности XNA , который написан на C #, и логика, вероятно, переносима на язык, который вы используете.