0
votes

Comment faire un feu clé qu'une seule fois lorsque vous appuyez sur?

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);
}


7 commentaires

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 ... 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 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; 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.


3 Réponses :


-1
votes

Ici, vous avez deux événements, sur chaque touche, la presse trois sont trois même que vous obtenez 1. clé (lorsque l'utilisateur appuie sur la touche, mais pas encore la clé) 2. keypress (sa tigue après l'événement de la clé) 3. Keyup (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 () .


0 commentaires

0
votes

comme @jaromandax suggéré, espace = faux; code> après p .Shoot (); code> vous donnera le résultat souhaité:

reproduire le problème: p>

<input />


2 commentaires

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 à 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.



0
votes

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

  • aucun - n'existe pas
  • tiré - c'est-à-dire besoin de créer un
  • existe - c'est en vol

    Le code pour le gérer est également simple trop simple xxx

    EDIT: Pour déclencher une balle chaque pression de la barre d'espace (permettant de multiples balles) xxx

    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> Vous pouvez également faire xxx

    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


3 commentaires

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 :)