Une manette de jeu peut-elle remplacer le clavier? Essayer de programmer avec des bĂątons

image


introduction



Pour taper sur le clavier, asseyez-vous ou restez immobile. Les manettes de jeu, en revanche, sont portables et compactes. En les contrÎlant, vous pouvez vous promener dans la piÚce ou vous allonger sur le canapé.



En raison du petit nombre de boutons sur la manette de jeu, personne ne les considérait comme un moyen de saisir des textes volumineux, par exemple dans la programmation.



Cependant, les sticks analogiques (et la plupart des gamepads en ont deux) ont le potentiel de fournir des options d'entrée infinies. La question se résume à choisir les bons gestes pour une efficacité maximale et une tension minimale sur les pouces.



Il existe de nombreuses façons de saisir du texte pour les manettes de jeu. Si vous avez déjà joué à des jeux sur console, il y a de fortes chances que vous en ayez utilisé un.









Saisie de texte à l'écran dans Legend of Zelda Dans Legend of Zelda, le joueur doit à tour de rÎle sélectionner les lettres en utilisant le D-pad avec des flÚches et à chaque fois en appuyant sur le bouton de confirmation pour ajouter une lettre au champ de saisie de texte.



Depuis lors, des mĂ©thodes de saisie plus efficaces ont Ă©tĂ© dĂ©veloppĂ©es. Si vous ĂȘtes intĂ©ressĂ©, lisez l' article sur Gamasutra .



Malheureusement, toutes les méthodes de saisie que j'ai trouvées présentent deux défauts majeurs qui les rendent impropres à un travail sérieux:



  • Ils ne sont pas assez rapides
  • Ils nĂ©cessitent un retour visuel


Le besoin de vitesse est clair. Le retour visuel est inacceptable car il occupe un espace d'écran précieux et distrait l'utilisateur, ce qui peut interférer avec le flux et ralentir.



Cependant, en l'absence de retour, tous les gestes doivent ĂȘtre mĂ©morisĂ©s et pratiquĂ©s jusqu'Ă  ce que vous puissiez les saisir avec une prĂ©cision suffisante. Il est peu probable que les jeux vidĂ©o obligent l'utilisateur Ă  passer quelques semaines Ă  apprendre Ă  saisir du texte, mais pour un moyen de saisir du texte pouvant ĂȘtre utilisĂ© dans n'importe quel programme, le prix est raisonnable et la formation elle-mĂȘme est comme maĂźtriser la saisie tactile.



Dans cet article, je dĂ©crirai briĂšvement les Ă©tapes de la crĂ©ation d'un systĂšme de saisie de texte pour les manettes de jeu pouvant ĂȘtre utilisĂ© en remplacement de la saisie volumĂ©trique au clavier.



DĂ©cider des gestes



Pour commencer, j'ai créé un outil de visualisation du mouvement des sticks de manettes analogiques basé sur pygamele langage Python. Pour plus de clarté, j'ai complété l'outil pour qu'il montre non seulement les positions actuelles des bùtons, mais aussi les positions précédentes de nuances de gris de plus en plus claires, afin que vous puissiez voir les chemins le long desquels les bùtons se déplacent.



La figure ci-dessous montre le mouvement simultané des deux sticks analogiques vers l'intérieur, vers le haut, vers l'extérieur, vers le bas, vers l'intérieur et vers le centre.





Visualisation des schémas de mouvement des sticks analogiques



La premiĂšre chose que j'ai remarquĂ©e est que puisque l'Ă©tat neutre du contrĂŽleur est de trouver les sticks au centre, toutes les options d'entrĂ©e doivent ĂȘtre accessibles Ă  partir de cet Ă©tat neutre et elles doivent toutes ĂȘtre complĂ©tĂ©es en ramenant les sticks au centre.



Avec ces limitations à l'esprit, j'ai compris que l'entrée la plus simple possible serait de déplacer l'un des bùtons dans n'importe quelle direction et de revenir au centre.





Le joystick gauche s'est déplacé vers le haut et vers le centre.



Combien de directions et quelles directions peuvent ĂȘtre sĂ©lectionnĂ©es prĂ©cisĂ©ment Ă  l'aveugle? Prenons l'exemple suivant.





Le joystick gauche s'est déplacé vers le haut, le bas, le centre, la gauche et la droite, et le joystick droit s'est déplacé en diagonale



. Quelques minutes d'expérimentation ont montré qu'il était possible de sélectionner avec précision les directions le long des axes, et l'entrée dans d'autres directions était beaucoup moins précise (comme le montre l'image précédente).



Les autres méthodes d'entrée les plus simples trouvées étaient les mouvements circulaires à une et deux étapes.





Joystick gauche déplacé vers le haut, la gauche et retour au centre





Le joystick gauche s'est déplacé vers le haut, la gauche, le bas et le retour au



centre.En tenant compte de tous les gestes inventés jusqu'à présent, nous avons obtenu 4 + 8 + 8 = 20 options de saisie sur chaque bùton.



Bien sĂ»r, les deux bĂątons peuvent ĂȘtre dĂ©placĂ©s en mĂȘme temps, crĂ©ant des gestes d'entrĂ©e combinĂ©s.





Les deux bĂątons se dĂ©placent vers le haut et vers le centre en mĂȘme temps.



Lorsque vous combinez des gestes, un total de 20 * 20 + 20 + 20 = 440 options d'entrée est obtenu, ce qui, à mon avis, est plus que suffisant.



Encodage des gestes



J'ai divisé l'espace d'entrée de chaque bùton en 4 secteurs et attribué un numéro à chaque secteur.



Espaces d'entrée divisés en secteurs


Espaces d'entrée divisés en secteurs



Ensuite, j'ai défini une zone de seuil autour du centre pour aider à déterminer si le bùton est en position neutre, ou dans l'un des secteurs.





Appui circulaire autour du centre



Comme vous pouvez le voir, le rayon du seuil est assez grand. Grùce à l'expérimentation, j'ai déterminé que c'est le meilleur rayon qui fournit le moins d'erreur.



Lorsqu'un des bùtons est décentré et franchit la zone de seuil, la séquence d'entrée commence. Lorsque les deux bùtons reviennent au centre à l'intérieur de la zone de seuil, la séquence est considérée comme terminée et est convertie en une paire de tuples décrivant le mouvement des bùtons.



Mouvements du manche pour l'entrée ((0,), (2, 3))


Déplacer les bùtons pour l'entrée ((0,), (2, 3))



Lier les gestes aux actions



Dans ce cas, les actions ne sont que des touches du clavier. Les boutons de dĂ©clenchement de la manette de jeu peuvent ĂȘtre liĂ©s aux touches Shift, Ctrl, Alt et Super, ce qui est pratique car ces touches sont utilisĂ©es dans des combinaisons (par exemple, Ctrl-C).



Pour déterminer la liaison optimale du geste et de la touche saisis, j'ai utilisé un keylogger pour enregistrer toutes les frappes et analysé la fréquence de chaque touche pendant plusieurs semaines.



Les touches les plus frĂ©quemment enfoncĂ©es doivent ĂȘtre liĂ©es aux gestes les plus simples (et donc les plus rapides). J'ai estimĂ© la complexitĂ© du geste en ajoutant les longueurs des entrĂ©es de chaque stick. Par exemple, l'entrĂ©e indiquĂ©e ci-dessus ((0,), (2, 3)) a une complexitĂ© 1 + 2 = 3.



Dans ce cas, lorsque vous entrez Ă  partir d'un bĂąton, l'utilisation alternĂ©e de deux bĂątons sera plus rapide que plusieurs entrĂ©es du mĂȘme bĂąton, il est donc souvent prĂ©fĂ©rable de lier les touches Ă  taper Ă  diffĂ©rents bĂątons.



En suivant cette logique, j'ai d'abord généré toutes les options d'entrée possibles à partir d'un seul bùton et les ai regroupées par difficulté. J'ai compté le nombre d'entrées dans chaque groupe de difficulté et j'ai pris le nombre de clés dans une liste triée des clés les plus fréquentes.



Mon objectif Ă©tait de diviser ces touches en deux groupes, un pour l'entrĂ©e du stick gauche et un pour le stick droit. Pour trouver des groupes idĂ©aux, j'ai crĂ©Ă© un graphique dans lequel les nƓuds Ă©taient les clĂ©s et les arĂȘtes pondĂ©rĂ©es Ă©taient les frĂ©quences des combinaisons de touches.



J'ai supprimĂ© cycliquement l'arĂȘte avec le moins de poids jusqu'Ă  ce que le graphique devienne bipartite. Si le graphe se dĂ©connectait, j'appliquais rĂ©cursivement l'algorithme de partitionnement aux composants connectĂ©s, et finalement combinais les groupes en ensembles indĂ©pendants.



Prenons l'exemple suivant. Le premier groupe de complexité se compose de toutes les entrées avec une complexité de 1, c'est-à-dire ((0,), ()), ((1,), ()), ((2,), ()), ((3,), ()), ((), (0,)), ((), (1,)), ((), (2,)), ((), (3,)).



Ce groupe a 8 entrĂ©es, nous prenons donc les 8 clĂ©s les plus frĂ©quentes de la liste triĂ©e. C'est ça 'e', 'o', 't', 'a', 'i', 's', 'j', 'r'. CrĂ©ez un graphique avec ces clĂ©s en tant que nƓuds et attribuez des pondĂ©rations aux arĂȘtes entre ces nƓuds en fonction de la frĂ©quence de chaque combinaison de touches.



Les touches e et r sont le plus souvent combinĂ©es, elles doivent donc ĂȘtre attachĂ©es Ă  des bĂątons diffĂ©rents.



Lorsque vous supprimez les arĂȘtes faibles du graphique, il est tĂŽt ou tard transformĂ© en non liĂ©.

La touche j est fréquente mais isolée.


La touche j est commune, mais isolée.



Vous vous demandez peut-ĂȘtre pourquoi la clĂ© jest l'une des 8 touches les plus frĂ©quentes, mais qu'elle a des liens si faibles avec le reste des touches frĂ©quentes. La raison en est qu'il est jactivement utilisĂ© lorsque vous travaillez avec VIM plus, sur mon systĂšme, cela fait partie d'une combinaison de touches de raccourci pour basculer entre les fenĂȘtres. Par consĂ©quent, il est plus souvent utilisĂ© isolĂ©ment que dans le texte.



Le graphe Ă©tant dĂ©connectĂ©, je continue Ă  appliquer l'algorithme aux composants connectĂ©s. Un sous-graphe constituĂ© uniquement d'un nƓud jest dĂ©jĂ  biparti ( j+ ensemble vide). J'applique rĂ©cursivement l'algorithme Ă  un autre composant.

Le composant est bipartite aprĂšs avoir supprimĂ© les arĂȘtes les plus faibles


AprĂšs avoir supprimĂ© les arĂȘtes les plus faibles, le composant devient biparti.



Le composant peut alors ĂȘtre facilement divisĂ© en deux groupes sans arĂȘtes entre les nƓuds du groupe.

Dessin bipartite du composant


Schéma de composants bipartites



En fin de compte, je combine les ensembles bipartites.

Regroupement final pour les 8 premiÚres clés


Le regroupement obtenu pour les 8 premiĂšres touches



Comme vous pouvez le voir, les liens les plus forts (les raccourcis clavier les plus frĂ©quents) sont situĂ©s entre les nƓuds de diffĂ©rents cĂŽtĂ©s, ce qui est exactement ce que je voulais.



J'ai répété ce processus pour les autres groupes de difficulté (entrées à une seule clé uniquement). Ensuite, j'ai généré toutes les entrées combinées possibles, les ai regroupées à nouveau par difficulté et affecté les touches restantes à ces options d'entrée. Comme les entrées combinées nécessitent l'utilisation des deux bùtons, le problÚme de la division des touches en deux groupes ne se pose pas ici.



J'ai utilisé le package pyautoguiPython pour générer des événements clavier lorsque des actions sont déclenchées.



Entraine toi



J'ai utilisĂ© le mĂȘme entraĂźneur tactile que j'avais ktouchdĂ©jĂ  utilisĂ© pour enseigner la frappe il y a prĂšs de deux dĂ©cennies. Pour cela, j'ai crĂ©Ă© des cours spĂ©cialisĂ©s.



S'entraĂźner Ă  la saisie tactile de la manette de jeu dans ktouch


Pratiquer l'entrée analogique sur une manette de jeu dans ktouch



Observations



  • Bien que le processus Python exĂ©cutant ce systĂšme d'entrĂ©e ne consomme gĂ©nĂ©ralement pas plus de 10% des ressources du processeur, s'il devait ĂȘtre constamment exĂ©cutĂ© en arriĂšre-plan, je le rĂ©implĂ©menterais et l'optimiserais dans un langage de niveau infĂ©rieur afin que le processeur puisse faire plus. tĂąches coĂ»teuses.
  • AprĂšs avoir achetĂ© une manette de jeu DualShock4, j'ai rĂ©alisĂ© que je pouvais faire une entrĂ©e diagonale assez prĂ©cisĂ©ment. L'intĂ©gration de l'entrĂ©e diagonale rĂ©duira le nombre d'options d'entrĂ©e plus complexes, et donc augmentera la vitesse.
  • , . , . , , , .
  • , . , , .
  • . .




En quelques jours, j'ai crĂ©Ă© un systĂšme de saisie efficace pour les manettes de jeu. De nombreuses amĂ©liorations peuvent ĂȘtre apportĂ©es, mais cette vĂ©rification de concept dĂ©montre qu'une saisie de texte efficace sur une manette de jeu est possible. Le code du projet est publiĂ© sur github .



All Articles