Załóżmy, że masz system wprowadzania oparty na odpytywaniu
void update()
{
if( Keyboard[ 'A' ] )
// A is down
}
Powiedz, że chcesz być w stanie rozpoznać kombinacje klawiszy o długości od 3 do 8 (np. Dół, dół-przód, przód, A dla hado-ken)
Jak najlepiej stworzyć ogólny (łatwy do modyfikacji / programowalny) system wprowadzania kombinacji klawiszy na zapytaniu wejściowym?
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:
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.
źródło
if(current_input[key].down){
nie chciałbyś również sprawdzić, czy klucz był wprevious_input
stanie? Jak napisano, myślę, że ciągle aktualizuje trzymany kluczdown_timestamp
.Zrób stos ostatnich X zdarzeń kluczowych, dla każdego zdarzenia kluczowego dodaj obiekt z kluczem i czasem naciśnięcia / zwolnienia, a następnie sprawdź, czy ostatnie elementy stosu pasują do specjalnego wzorca i czy te klawisze zostały naciśnięte wystarczająco szybko, aby liczą się jako kombinacja. Na koniec usuń najstarszy obiekt ze stosu.
źródło