Jednym ze sposobów jest przechowywanie obecnych i poprzednich stanów wejściowych i porównywanie ich za każdym razem, gdy sondujesz dane wejściowe.
Dla każdego klawisza, który można nacisnąć, przechowuj obiekt, który ma znacznik czasu ostatniej zmiany tego klawisza ze stanu obniżonego na wyższy.
Zaktualizuj te obiekty, wykonując to przy każdej ankiecie:
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;
}
}
}
Teraz możesz dopasować wzór do swoich kombinacji z zawartością keys
.
Mają obiekt kombi dla każdej kombinacji i wywołują aktualizację () na każdym obiekcie kombinacji przy każdej ankiecie.
Metoda update () obiektu combo dopasuje wzór do zestawu, sprawdzając, czy podczas tej ankiety spełnione są wszystkie niezbędne warunki dla zestawu. Oznacza to, że dotychczasowe znaczniki czasowe klawiszy dla kombinacji są w porządku i żaden inny klawisz, który złamałby kombinację nie został wciśnięty w tej ramce. Dla każdego spełnionego warunku zwiększ licznik w obiekcie kombi do następnego warunku do sprawdzenia. Gdy wszystkie warunki zostaną spełnione w kombinacji, wywołaj metodę, którą kombinacja powinna wykonać. Jeśli some_key_has_been_pressed == true
nie został naciśnięty klawisz będący kolejnym warunkiem dla kombinacji, zresetuj licznik spełnionego warunku dla kombinacji na 0.
Powyższe jest moją preferowaną metodą, ponieważ jest łatwe do wdrożenia, łatwe w utrzymaniu, wydajne i wysoce modułowe.
Jednak w przypadku innej dobrej metody sprawdź próbkę sekwencji wejściowej XNA , która jest napisana w języku C #, a logika jest prawdopodobnie możliwa do przeniesienia do używanego języka.