Uma maneira é armazenar os estados de entrada atuais e anteriores e compará-los sempre que você pesquisar a entrada.
Para cada tecla que pode ser pressionada, armazene um objeto com um registro de data e hora da última vez em que a tecla mudou de um estado inativo para um estado ativo.
Atualize esses objetos fazendo isso em todas as pesquisas:
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;
}
}
}
Agora você pode combinar seus combos com o conteúdo de keys
.
Tenha um objeto de combinação para cada combinação e chame update () em cada objeto de combinação em cada pesquisa.
O método update () de um objeto de combinação corresponderá ao padrão, verificando se todas as condições necessárias para o combo são satisfeitas nesta enquete. Ou seja, todos os timestamps de teclas do combo até o momento estão em ordem e nenhuma outra tecla que interrompa o combo foi pressionada nesse quadro. Para cada condição atendida, aumente um contador no objeto combo para a próxima condição a ser verificada. Quando todas as condições forem atendidas em um combo, chame o método que o combo deve executar. Se some_key_has_been_pressed == true
a tecla que é a próxima condição do combo não tiver sido pressionada, redefina o contador de condições satisfeitas do combo para 0.
O acima é o meu método preferido, pois é simples de implementar, fácil de manter, eficiente e altamente modular.
No entanto, para outro bom método, consulte a amostra da sequência de entrada XNA , escrita em C #, e a lógica provavelmente pode ser transferida para o idioma que você está usando.