Angenommen, Sie haben ein Eingabesystem, das auf Abfragen basiert
void update()
{
if( Keyboard[ 'A' ] )
// A is down
}
Angenommen, Sie möchten Tastenkombinationen mit einer Länge von 3 bis 8 erkennen können (z. B. nach unten, nach unten, nach vorne, A für Hado-Ken).
Wie würden Sie am besten ein generisches (leicht modifizierbares / programmierbares) Tastenkombinations-Eingabesystem für abgefragte Eingaben erstellen ?
Eine Möglichkeit besteht darin, den aktuellen und den vorherigen Eingabezustand zu speichern und jedes Mal zu vergleichen, wenn Sie die Eingabe abfragen.
Speichern Sie für jede Taste, die gedrückt werden kann, ein Objekt mit einem Zeitstempel des letzten Umschaltens der Taste von einem Abwärtszustand in einen Aufwärtszustand.
Aktualisieren Sie diese Objekte, indem Sie dies bei jeder Umfrage tun:
Jetzt können Sie Ihre Combos mit dem Inhalt von vergleichen
keys
.Haben Sie ein Kombinationsobjekt für jede Kombination und rufen Sie bei jeder Abfrage update () für jedes Kombinationsobjekt auf.
Die update () -Methode eines Kombinationsobjekts stimmt mit der Kombination überein und prüft, ob bei dieser Abfrage alle erforderlichen Bedingungen für die Kombination erfüllt sind. Dh alle Tasten-Zeitstempel für die Combo sind bisher in Ordnung, und keine andere Taste, die die Combo brechen würde, wurde in diesem Frame gedrückt. Erhöhen Sie für jede erfüllte Bedingung einen Zähler im Kombinationsobjekt auf die nächste zu überprüfende Bedingung. Wenn alle Bedingungen in einer Kombination erfüllt sind, rufen Sie die Methode auf, die die Kombination ausführen soll. Wenn
some_key_has_been_pressed == true
aber die Taste, die die nächste Bedingung für die Kombination ist, nicht gedrückt wurde, setzen Sie den Zähler für die erfüllte Bedingung der Kombination auf 0 zurück.Das Obige ist meine bevorzugte Methode, da es einfach zu implementieren, leicht zu warten, effizient und hochmodular ist.
Schauen Sie sich für eine andere gute Methode das Beispiel der XNA-Eingabesequenz an , das in C # geschrieben ist, und die Logik ist wahrscheinlich auf die von Ihnen verwendete Sprache übertragbar.
quelle
if(current_input[key].down){
nicht auch überprüfen, ob der Schlüssel imprevious_input
Status vorhanden ist? Wie geschrieben, würde es die gehaltenen Schlüssel kontinuierlich aktualisierendown_timestamp
.Erstellen Sie einen Stapel der letzten X-Tastenereignisse. Fügen Sie für jedes Tastenereignis ein Objekt mit der Taste und dem Zeitpunkt der Druck- / Freigabe hinzu. Überprüfen Sie dann, ob die letzten Mitglieder des Stapels einem speziellen Muster entsprechen und ob diese Tasten schnell genug gedrückt wurden zählen als eine Kombination. Entfernen Sie schließlich das älteste Objekt vom Stapel.
quelle