Je fais un jeu JavaScript simple (style spatial envahisseurs) s> (tireur d'espace haut de gamme) et j'essaie de rendre mon personnage tirer une balle par chaque touche "espace". Comment puis-je faire cela?
J'ai essayé de multiples approches, définissant un drapeau à l'aide d'un drapeau à la place de la touche, des recherches de Google (a également rencontré cette question similaire, mais cela n'a pas encore aidé: JAJAVASCRIPT SOYEKEDOWN EVENTOIR UNIQUE UNE Une fois? ) P>
ci-dessous est un exemple d'une solution que j'ai essayée . P>
document.onkeydown = function(e) { if(e.keyCode == 32 && space == false) { space = true; } } document.onkeyup = function(e) { if(e.keyCode == 32) space = false; } window.requestAnimationFrame(gameLoop); function gameLoop(timeStamp) { if(space === true) { p.shoot(); } window.requestAnimationFrame(gameLoop); }
3 Réponses :
Ici, vous avez deux événements, sur chaque touche, la presse trois sont trois même que vous obtenez
1. clé code> (lorsque l'utilisateur appuie sur la touche, mais pas encore la clé)
2.
keypress code> (sa tigue après l'événement de la clé)
3.
Keyup code> (lorsque l'utilisateur publie la clé)
Si vous voulez tirer une seule fois pour chaque frappe
Mettre en œuvre sur ceux-ci si implémenter toutes les trois méthodes des trois toutes les trois méthodes seront tirées.
De plus: pour la sécurité, vous pouvez écrire
e.preventDefault () code>. P>
comme @jaromandax suggéré, reproduire le problème:
p> espace = faux; code> après
p .Shoot (); code> vous donnera le résultat souhaité:
<input />
Pas nécessairement, car p.shoot n'est pas synchrone et que la balle prendra plusieurs cadres pour "expirer" - il suffit de définir simplement espace = faux code> à ce stade ne va pas aider
Malheureusement, cela ne résout pas mon problème. Si je maintiens la touche "Espace", il tire une balle simple, puis le déclenchera plus à plusieurs reprises.
Il y a vraiment 3 états à une balle - et en prenant en compte que dans les envahisseurs de l'espace classique, le joueur ne peut avoir qu'une balle en vol à la fois, cela rend les choses relativement simples
la balle peut être p>
Le code pour le gérer est également simple trop simple p> EDIT: Pour déclencher une balle chaque pression de la barre d'espace (permettant de multiples balles) p>
blockQuote> J'utilise Firebullet ++ et Firebullet-- Parce que je suppose qu'il est plausible que quelqu'un puisse relâcher et appuyer sur la barre d'espace à moins de 16 ms (image unique): P P> < p> Vous pouvez également faire p> de cette façon de gérer plusieurs balles de plusieurs puces ok, mais ne tirez que d'un par image - dépend vraiment de la façon dont vous voulez gérer quelqu'un avec un Doigt de déclenchement rapide: p p> p>
Je suis désolé de ne pas être clair. Mon intention dans ce jeu spécifique que je fais est de permettre aux joueurs de tirer autant de balles qu'ils le souhaitent (il peut y avoir plusieurs balles en vol à un moment donné) en fonction de la rapidité avec laquelle ils appuient sur la touche "Espace".
oh, d'accord, je pensais que tu avais dit des envahisseurs spatiaux: P laissez-moi de réécrire que
Pas de soucis! C'était de ma faute. J'ai édité ma question alors c'est plus clair maintenant :)
Vous ne pouvez pas empêcher les événements clés Fire plusieurs fois, mais vous pouvez vérifier si la clé est répété .
Vous ne pouvez pas vraiment vous attendre à ce que cet événement soit viré une fois par clé. Vous devez terminer avec la logique qui le laissera passer une fois par clé. Si c'est ce que vous voulez, je posterai une réponse à ce sujet.
Le code ne montre pas vraiment assez pour vous aider
Je suppose que votre code qui "incendie la balle" vérifie juste l'état de
espace code> ... dans une boucle ... tellement tire une balle chaque itération ... dans les envahisseurs spatiaux, vous pouvez seulement tirer une balle à la fois ... SO
espace = faux code> doit être fait lorsque la balle "expire" et que vous avez besoin d'une autre logique qui dit "Il y a déjà une balle, alors ne faites pas un nouveau"
Je serai heureux que vous puissiez poster une réponse où cet événement tirera une fois par clé. Je vais également modifier cette question et montrer plus de lignes de mon code.
@Kfir Il n'est pas possible, mais comme je l'ai dit dans le commentaire précédent, vous pouvez détecter si la clé a été répétée. Mettez
si (e.rebeat) renvoie; code> comme première ligne de la fonction de manutention de la clé et n'utilisez pas du tout à utiliser (au cas où vous n'en avez pas besoin pour autre chose).
Votre mise à jour a confirmé ma suspicion ... Votre boucle d'animation déclenchera une balle chaque itération jusqu'à ce que la touche spatiale soit libérée.