2015-04-09 4 views
1

Donc, je suis en train de coder un jeu qui utilisera une entrée au clavier. Je suivre les événements KeyDown et KeyUp similaires ici:L'entrée du jeu Javascript perd son focus

http://nokarma.org/2011/02/27/javascript-game-development-keyboard-input/index.html

Cependant, il y a des cas où l'utilisation des événements keyUp/KEYDOWN peuvent manquer. J'ai essayé d'ajouter un flou à mon corps, mais il y a des cas d'utilisation où ça ne brouille pas. L'exemple le plus simple que je peux donner est que si un utilisateur clique sur une zone en dehors du document, par exemple sur un marque-page, le navigateur ne donne aucun événement au DOM et le menu contextuel commence à recevoir des entrées clavier. SO, si l'utilisateur maintenait la flèche HAUT et maintenait la flèche haut, clique avec le bouton droit sur un signet, puis relâche la touche fléchée, l'événement KeyUp correspondant ne sera jamais donné au navigateur. Si l'utilisateur appuie à nouveau sur la touche, la clé se réinitialisera, mais cela reste un bug. Pour Chrome et Firefox, je pouvais utiliser l'API PointerLock, mais je voulais savoir s'il y avait autre chose que je pouvais faire. J'ai pensé à flouter automatiquement si la souris quitte la zone client, mais quand je joue à des jeux, je déplace généralement la souris dans un coin inférieur. AFAIK on ne peut pas interroger manuellement le clavier. Y a-t-il des solutions de rechange que j'ai ratées?

Répondre

0

Je ne sais pas si cela vous aiderait mais dans votre implémentation, sur la méthode keydown changez une variable quelque part pour indiquer qu'elle a été pressée.

Exécutez également une minuterie qui remet à zéro la valeur toutes les x ms à unpressed (si elle est encore pressé la méthode keydown doit tirer dans le même jour)

Ensuite, la méthode keyup changer la variable à unpressed. Cela devrait donner une indication plus fiable si les boutons sont enfoncés et j'ai précédemment utilisé une méthode simulaire sur un jeu java qui fonctionnait magnifiquement!

+1

Le temps entre les pressions sur les touches semble varier considérablement, donc je vais les faire expirer après un nombre de millisecondes "sûr". Chaque événement de clavier réinitialisera la minuterie. Pourtant, c'est exactement le genre de travail que je cherchais. Merci beaucoup. –