retirer la clé de contact presse retard en javascript
J'ai le problème suivant:
Je suis en train d'écrire un script javascript jeu, et le caractère est contrôlé par les touches fléchées.
Le problème est que, lorsque l'on maintient la touche enfoncée, il existe un délai entre le tir à la première pression de touche et la répétition de l'kepress.
Aussi, lorsque l'on appuie sur la "flèche droite" et la maintient enfoncée, puis appuie sur la "flèche haut", le personnage ne se déplace pas vers le coin supérieur droit, mais cesse de le déplacer dans la bonne direction et commence à se déplacer vers le haut.
C'est le code que j'utilise:
<body onLoad="Load()" onKeyDown="Pressed(event)">
fonction Pressé(e) { cxc = e.keyCode; si(cxc == 37) Déplacer(-1,0); si(cxc == 38) Move(0,-1); si(cxc == 39) Déplacer(1,0); si(cxc == 40) Déplacer(0,1); }
quelqu'un a une idée??
- votre code ne marchera pas, c'est sûr. ne suis pas sûr si vous pouvez tester que deux touches sont enfoncées en même temps, en JS. va attendre les réponses.
- bien, c'est dans l'acte de travail, mais pas comme prévu. Mon jeu est un minuteur de jeu, et waisting 1sec en attendant que les frappes répétées n'est pas bon. C'est frustrant.
- pourquoi ne pas vous essayer à l'aide d'une approche à base de mémoire flash. un transparent flash swf qui capture les événements et ensuite en conséquence appels JS. java2s.com/Code/Flash-Flex-ActionScript/Development/...
- Pas de flash, c'est trop de travail et il ne fonctionne pas pour tout le monde. Mon jeu va être un "non-flash-jeu". Je préfère HTML5
- HTML5? Cela ne fonctionne pas pour tout le monde! Enfait Flash a 98% de taux d'adoption.
- Oui, mais alors, je peux dire que mon jeu n'utilise pas de flash.
- Oui, mais
HTML5
fonctionnera pour tout le monde.... - Je souhaite que nos IE6 amis bonne chance! Voici quelque chose que vous pourriez avoir un coup d'oeil à quirksmode.org/js/keys.html
- Lire la suite de la répondre. Il peut vous aider.
- Oui, il est possible de tester si les deux touches sont enfoncées en même temps, en JavaScript. Cependant, vous avez besoin pour créer des événements de le faire. Lire la réponse j'ai fait un lien dans mon commentaire ci-dessus.
Vous devez vous connecter pour publier un commentaire.
Si vous voulez de répétition, dans un mode contrôlable, vous aurez à mettre en œuvre vous-même, en tant que touche les événements sont déclenchés dépend de l'OS idée de la façon dont les touches de répétition. Cela signifie qu'il peut être variable initiale et à la suite de retards, et maintenez les deux touches à la fois causera un seul d'entre eux à le répéter.
Vous devez garder une trace de savoir si chaque touche est enfoncée, et d'ignorer
keydown
événements lorsque la clé est déjà bas. C'est parce que de nombreux navigateurs feu unkeydown
ainsi que d'unkeypress
événement lorsqu'une autorepeat se produit, et si vous êtes à la reproduction de clé répéter vous-même, vous aurez besoin de supprimer cette.Par exemple:
alors:
Bien que, la plupart des action-jeux basés sur le fixe, le temps de châssis principal de la boucle, que vous pouvez attacher la touche up/down de la manipulation dans.
Je l'ai résolu comme ceci:
<body onLoad="Load()" onKeyDown="Down(event)" onKeyUp="Up(event)">
Que vous pourriez commencer le mouvement onkeydown et seulement à la fin il onkeyup?
Que cet événement est de déplacer
whatever
à partir d'une position une position, pourquoi n'utilisez-vous pasonkeypress
de l'événement, ce qui fait que si l'utilisateur appuie sur la touche de laup
clé, lawhatever
vont continuer à aller de l'Pressed(e)
sera appelé plusieurs fois jusqu'à ce que l'utilisateur relâche la touche.C'est ici Lucas solution en version abstraite:
http://jsfiddle.net/V2JeN/4/
Semble que vous ne pouvez appuyer sur 3 touches à la fois, à ma grande surprise.
Je suis un total novice à ce niveau, mais pourquoi ne pas combiner KeyDown avec KeyUp? Je suis en train de travailler sur un projet similaire, dès maintenant et, après vérification de quirksmode je vais mettre de suite à trouver comment combiner les deux événements tels que l'ensemble du temps entre le Bas et le Haut se rend compte de l'effet souhaité.
C'est presque la même que l'excellente réponse de @bobince
J'ai modifié légèrement pour permettre aux valeurs de l'intervalle
J'ai aussi un plan pour utiliser setTimeout au lieu de setInterval pour les raisons données à cette question: setTimeout ou setInterval?
Je vais mettre à jour cette réponse une fois que j'ai modifié et testé.