
Einführung
Um auf der Tastatur zu tippen, sitzen oder stehen Sie still. Gamepads sind dagegen tragbar und kompakt. Wenn Sie sie steuern, können Sie durch den Raum gehen oder sich auf das Sofa legen.
Aufgrund der geringen Anzahl von Tasten auf dem Gamepad wurden sie von niemandem als Mittel zur Eingabe umfangreicher Texte angesehen, beispielsweise bei der Programmierung.
Analoge Sticks (und die meisten Gamepads haben zwei) bieten jedoch das Potenzial, endlose Eingabemöglichkeiten bereitzustellen. Die Frage besteht darin, die richtigen Gesten für maximale Effizienz und minimale Spannung auf den Daumen auszuwählen.
Es gibt viele Möglichkeiten, Text für Gamepads einzugeben. Wenn Sie jemals Konsolenspiele gespielt haben, haben Sie wahrscheinlich eines davon verwendet.

Texteingabe auf dem Bildschirm in Legend of Zelda In Legend of Zelda muss der Spieler abwechselnd Buchstaben mit dem Steuerkreuz mit Pfeilen auswählen und jedes Mal die Bestätigungstaste drücken, um dem Texteingabefeld einen Buchstaben hinzuzufügen.
Seitdem wurden effizientere Eingabemethoden entwickelt. Wenn Sie interessiert sind, lesen Sie den Artikel über Gamasutra .
Leider weisen alle Eingabemethoden, die ich gefunden habe, zwei Hauptfehler auf, die sie für ernsthafte Arbeiten ungeeignet machen:
- Sie sind nicht schnell genug
- Sie erfordern visuelles Feedback
Das Bedürfnis nach Geschwindigkeit ist klar. Visuelles Feedback ist nicht akzeptabel, da es wertvollen Platz auf dem Bildschirm beansprucht und den Benutzer ablenkt, was den Fluss stören und verlangsamen kann.
Wenn jedoch keine Rückmeldung erfolgt, müssen alle Gesten gespeichert und geübt werden, bis Sie sie mit ausreichender Genauigkeit eingeben können. Es ist unwahrscheinlich, dass Videospiele den Benutzer dazu bringen, ein paar Wochen lang zu lernen, wie man Text eingibt. Um jedoch Text einzugeben, der in jedem Programm verwendet werden kann, ist der Preis akzeptabel und das Training selbst ist wie das Beherrschen von Berührungseingaben.
In diesem Beitrag werde ich kurz die Schritte beschreiben, die beim Erstellen eines Texteingabesystems für Gamepads erforderlich sind, das als Ersatz für die volumetrische Tastatureingabe verwendet werden kann.
Über Gesten entscheiden
Zunächst habe ich ein Tool zur Visualisierung der Bewegung von analogen Gamepad-Sticks basierend auf
pygameder Python-Sprache erstellt. Aus Gründen der Übersichtlichkeit habe ich das Werkzeug so ergänzt, dass nicht nur die aktuellen Positionen der Sticks angezeigt werden, sondern auch die vorherigen Positionen von immer helleren Graustufen, sodass Sie die Pfade sehen können, auf denen sich die Sticks bewegen.
Die folgende Abbildung zeigt die gleichzeitige Bewegung beider Analogsticks nach innen, oben, außen, unten, wieder nach innen und zurück in die Mitte.

Visualisierung der Bewegungsmuster von analogen Sticks
Das erste, was mir aufgefallen ist, ist, dass alle Eingabemöglichkeiten von diesem neutralen Zustand aus erreichbar sein müssen und alle mit der Rückkehr der Sticks in die Mitte enden müssen, da der neutrale Zustand des Gamepads darin besteht, die Sticks in der Mitte zu finden.
Unter Berücksichtigung dieser Einschränkungen stellte ich fest, dass die einfachste Eingabe darin besteht, einen der Sticks in eine beliebige Richtung und zurück in die Mitte zu bewegen.

Der linke Steuerknüppel hat sich nach oben und hinten in die Mitte bewegt.
Wie viele Richtungen und welche Richtungen können blind blind ausgewählt werden? Betrachten Sie das folgende Beispiel.

Der linke Steuerknüppel bewegte sich nach oben, unten, in der Mitte, nach links und rechts, und der rechte Steuerknüppel bewegte sich diagonal.
Einige Minuten des Experimentierens zeigten, dass es möglich war, Richtungen entlang der Achsen genau auszuwählen, und die Eingabe in andere Richtungen war viel weniger genau (wie im vorherigen Bild gezeigt).
Die nächst einfacheren Eingabemethoden waren einstufige und zweistufige Kreisbewegungen.

Der linke Steuerknüppel bewegte sich nach oben, links und zurück in die Mitte

Der linke Stick bewegte sich nach oben, links, unten und zurück in die Mitte.
Unter Berücksichtigung aller bisher erfundenen Gesten erhielten wir 4 + 8 + 8 = 20 Eingabemöglichkeiten für jeden Stick.
Natürlich können beide Sticks gleichzeitig bewegt werden, wodurch kombinierte Eingabegesten entstehen.

Beide Sticks bewegen sich gleichzeitig nach oben und zurück in die Mitte. Durch die Kombination von
Gesten ergeben sich insgesamt 20 * 20 + 20 + 20 = 440 Eingabemöglichkeiten, was meiner Meinung nach mehr als ausreichend ist.
Codierungsgesten
Ich habe den Eingabebereich jedes Sticks in 4 Sektoren unterteilt und jedem Sektor eine Nummer zugewiesen.

Eingaberäume in Sektoren unterteilt
Dann habe ich einen Schwellenbereich um die Mitte festgelegt, um festzustellen, ob sich der Stick in der neutralen Position oder in einem der Sektoren befindet.

Kreisförmige Schwelle um die Mitte
Wie Sie sehen können, ist der Radius der Schwelle ziemlich groß. Durch Experimente habe ich festgestellt, dass dies der beste Radius ist, der die geringste Fehlermenge liefert.
Wenn einer der Sticks außermittig ist und den Schwellenbereich überschreitet, beginnt die Eingabesequenz. Wenn beide Sticks in die Mitte innerhalb des Schwellenbereichs zurückkehren, wird die Sequenz als vollständig betrachtet und in ein Paar Tupel umgewandelt, die die Bewegung der Sticks beschreiben.

Bewegen Sie die Sticks für die Eingabe ((0,), (2, 3))
Gesten mit Aktionen verknüpfen
In diesem Fall sind die Aktionen nur Tastaturtasten. Gamepad-Auslösetasten können an die Umschalt-, Strg-, Alt- und Supertasten gebunden werden. Dies ist praktisch, da diese Tasten in Kombinationen verwendet werden (z. B. Strg-C).
Um die optimale Bindung der eingegebenen Geste und Taste zu bestimmen, habe ich mit einem Keylogger alle Tastenanschläge aufgezeichnet und die Häufigkeit jeder Taste mehrere Wochen lang analysiert.
Die am häufigsten gedrückten Tasten sollten an die einfachsten (und damit schnellsten) Gesten gebunden sein. Ich schätzte die Komplexität der Geste, indem ich die Länge der Eingaben jedes Sticks addierte. Beispielsweise hat die oben gezeigte Eingabe ((0,), (2, 3)) die Komplexität 1 + 2 = 3.
In diesem Fall ist die abwechselnde Verwendung von zwei Sticks bei der Eingabe von einem Stick schneller als die mehrfache Eingabe von demselben Stick. Daher ist es häufig besser, die zu tippenden Tasten verschiedenen Sticks zuzuweisen.
Nach dieser Logik habe ich zunächst alle möglichen Eingabemöglichkeiten von einem Stick generiert und nach Schwierigkeitsgrad gruppiert. Ich zählte die Anzahl der Eingaben in jeder Schwierigkeitsgruppe und nahm die Anzahl der Schlüssel aus einer sortierten Liste der häufigsten Schlüssel.
Mein Ziel war es, diese Tasten in zwei Gruppen aufzuteilen, eine für die Eingabe des linken Sticks und eine für die Eingabe des rechten Sticks. Um ideale Gruppen zu finden, habe ich ein Diagramm erstellt, in dem die Knoten die Schlüssel und die gewichteten Kanten die Häufigkeiten der Tastenkombinationen waren.
Ich entfernte zyklisch die Kante mit dem geringsten Gewicht, bis der Graph zweiteilig wurde. Wenn der Graph getrennt wurde, habe ich den Partitionierungsalgorithmus rekursiv auf die verbundenen Komponenten angewendet und am Ende die Gruppen zu unabhängigen Mengen zusammengefasst.
Betrachten Sie das folgende Beispiel. Die erste Komplexitätsgruppe besteht aus allen Eingaben mit einer Komplexität von 1
((0,), ()), ((1,), ()), ((2,), ()), ((3,), ()), ((), (0,)), ((), (1,)), ((), (2,)), ((), (3,)).
Es gibt 8 Eingaben in dieser Gruppe, daher nehmen wir die 8 häufigsten Schlüssel aus der sortierten Liste. Das ist
'e', 'o', 't', 'a', 'i', 's', 'j', 'r'. Erstellen Sie ein Diagramm mit diesen Schlüsseln als Knoten und weisen Sie den Kanten zwischen diesen Knoten Gewichte zu, die der Häufigkeit jeder Tastenkombination entsprechen.

Die Tasten e und r werden meistens kombiniert, daher müssen sie an verschiedenen Sticks befestigt werden.
Wenn schwache Kanten aus dem Diagramm entfernt werden, werden sie früher oder später nicht mehr verknüpft.

Die Taste j ist üblich, aber isoliert.
Sie fragen sich vielleicht, warum der Schlüssel
jeiner der 8 häufigsten Schlüssel ist, aber so schwache Verbindungen zu den übrigen häufigen Schlüsseln hat. Der Grund dafür ist, dass es jbei der Arbeit mit VIM plus aktiv verwendet wird. Auf meinem System ist dies Teil einer Hotkey-Kombination zum Wechseln zwischen Fenstern. Daher wird es häufiger isoliert als im Text verwendet.
Da der Graph nicht verbunden ist, wende ich den Algorithmus weiterhin auf verbundene Komponenten an. Ein Untergraph, der nur aus einem Knoten besteht,
jist bereits zweiteilig ( j+ leere Menge). Ich wende den Algorithmus rekursiv auf eine andere Komponente an.

Nach dem Entfernen der schwächsten Kanten wird die Komponente zweiteilig.
Die Komponente kann dann problemlos in zwei Gruppen ohne Kanten zwischen den Knoten in der Gruppe aufgeteilt werden.

Bipartite Component Scheme
Am Ende kombiniere ich die Bipartite Sets.

Die Gruppierung für die ersten 8 Tasten
Wie Sie sehen, befinden sich die stärksten Links (die häufigsten Tastaturkürzel) zwischen den Knoten auf verschiedenen Seiten, genau das, was ich wollte.
Ich habe diesen Vorgang für die anderen Schwierigkeitsgruppen wiederholt (nur Eingaben mit einem Stick). Dann habe ich alle möglichen kombinierten Eingaben generiert, sie erneut nach Schwierigkeitsgraden gruppiert und den Eingabeoptionen die verbleibenden Tasten zugewiesen. Da für kombinierte Eingaben beide Sticks verwendet werden müssen, tritt das Problem der Aufteilung der Tasten in zwei Gruppen hier nicht auf.
Ich habe das
pyautoguiPython- Paket verwendet , um Tastaturereignisse zu generieren, wenn Aktionen ausgelöst werden.
Trainieren
Ich habe denselben Touch-Trainer verwendet, mit dem ich
ktouchbereits vor fast zwei Jahrzehnten das Tippen unterrichtet habe. Zu diesem Zweck habe ich spezielle Lektionen erstellt.

Üben des analogen Eingangs auf einem Gamepad in ktouch
Beobachtungen
- Obwohl der Python-Prozess, auf dem dieses Eingabesystem ausgeführt wird, normalerweise nicht mehr als 10% der CPU-Ressourcen verbraucht, würde ich ihn, wenn er ständig im Hintergrund ausgeführt werden müsste, erneut implementieren und in einer niedrigeren Sprache optimieren, damit der Prozessor mehr kann kostspielige Aufgaben.
- Nach dem Kauf eines DualShock4-Gamepads wurde mir klar, dass ich diagonale Eingaben ziemlich genau ausführen kann. Durch die Integration der diagonalen Eingabe wird die Anzahl komplexerer Eingabemöglichkeiten verringert und daher die Geschwindigkeit erhöht.
- , . , . , , , .
- , . , , .
- . .
In nur wenigen Tagen habe ich ein effizientes Eingabesystem für Gamepads erstellt. Es gibt viele Verbesserungen, die vorgenommen werden können, aber diese Konzeptprüfung zeigt, dass eine effiziente Eingabe des Gamepads möglich ist. Der Projektcode wird auf github veröffentlicht .