IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XNA/Monogame Discussion :

Créer un délai/une pause ou une différence de temps écoulé


Sujet :

XNA/Monogame

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 123
    Points : 53
    Points
    53
    Par défaut Créer un délai/une pause ou une différence de temps écoulé
    Bonjour,

    Je rencontre un petit problème dans le développement d'un shoot em up 2D (oui j'ai abandonné l'idée du point n click pour l'instant xD)

    Lorsque l'utilisateur appuie sur Espace, un projectile est créé, évidemment le problème est qu'un projectile est créé à chaque tick du gameTime tant que l'on reste appuyé sur Espace, je voudrais donc empêcher ça et créer une cadence de tir correcte (tout en gardant Espace enfoncé), j'ai tenté de faire un truc avec un gameTime.Elapsed blabla mais sans succès !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // Création d'un nouveau projectile si on appuie sur Espace
    if (Keyboard.GetState().IsKeyDown(Keys.Space))
    {
                    lesProjectiles.Add(new Projectile(graphics, srcProjoBob, new Vector2(leVaisseau.PosX + 45, leVaisseau.PosY - 5)));
    }
    Ce code se trouve dans le Update

    Merci de vos futures réponses

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Daikyo Voir le message
    Bonjour,

    Lorsque l'utilisateur appuie sur Espace, un projectile est créé, évidemment le problème est qu'un projectile est créé à chaque tick du gameTime tant que l'on reste appuyé sur Espace, je voudrais donc empêcher ça et créer une cadence de tir correcte (tout en gardant Espace enfoncé), j'ai tenté de faire un truc avec un gameTime.Elapsed blabla mais sans succès !
    Algorithme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    si touche Fire appuyée:
      si t0 n'est pas valide
      si heure courante - t0 > laps de temps entre 2 tirs:
        tir
        t0 <-- heure courante
      fin si
    sinon:
      invalider t0
    fin si
    Attention: un GameTime n'est pas une structure - il s'agit d'une classe. Tu ne peux donc pas effectuer une assignation est espérer qu'une copie a été faite. Il te faut réaliser une vraie copie.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 123
    Points : 53
    Points
    53
    Par défaut
    Que représente t0 ? Le temps entre 2 ticks de GameTime ?
    Que veux-tu dire par invalider ?

    Merci de ton aide, je vais essayer de voir avec ça

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par Daikyo Voir le message
    Que représente t0 ? Le temps entre 2 ticks de GameTime ?
    Non. t0 est une copie du GameTime courant effectuée au moment où un missile est lancé. En bref, c'est l'heure à laquelle à eu lieu le dernier tir.

    Citation Envoyé par Daikyo Voir le message
    Que veux-tu dire par invalider ?
    Je veux dire: le rendre non valide

    Dans l'algorithme donné, j'ai besoin de savoir si je suis dans l'état "appuyé depuis un certain temps et un missile a déja été tiré" ou si je suis dans l'état "je viens d'appuyer sur la touche "Fire", et je n'ai pas encore tiré le missile". Je suis d'accord, mon explication aurait été plus claire si j'avais séparé les deux comportement de t0 en un heure_dernier_tir (qui garde la même sémantique concernant la gestion des temps) et une autre variable tir_en_cours, qui est true à partir du moment ou un tir a été fait et false dès qu'on relâche le bouton "Fire".

    Reprenons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    si touche Fire appuyée:
      si tir_en_cours est FAUX
        tir
        heure_dernier_tir <-- heure courante
        tir_en_cours <-- VRAI
      sinon
        si heure courante - heure_dernier_tir > laps de temps entre 2 tirs:
          tir
          heure_dernier_tir <-- heure courante
        fin si
      fin si
    sinon:
      tir_en_cours <-- FAUX
    fin si
    J'espère que c'est un poil plus clair...
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    123
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 123
    Points : 53
    Points
    53
    Par défaut
    Merci beaucoup pour ton algorithme, j'ai réussi

    Désolé pour la réponse très tardive :p

  6. #6
    Membre du Club
    Inscrit en
    Novembre 2006
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 371
    Points : 45
    Points
    45
    Par défaut
    lui il a compris, moi j'ai rien compris.

    l'algorithme est bien facile mais je trouve pas l'équivalent de ça en programmation.

    tu peux nous faire un petit code qui explique ton algorithme ?

    merci avance

  7. #7
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par CLion Voir le message
    lui il a compris, moi j'ai rien compris.

    l'algorithme est bien facile mais je trouve pas l'équivalent de ça en programmation.

    tu peux nous faire un petit code qui explique ton algorithme ?

    merci avance
    Ce n'est pas particulièrement compliqué, mais là je suis sous Linux, donc je vais avoir du mal à fournir un code fonctionnel testé. Disons que ça va ressembler à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class PlayerControler
    {
      private MissileTouret touret = new MissileTouret();
      public MissileTouret Touret { get { return touret; } }
      public bool FireButton 
      { 
        get { return Keyboard.GetState().IsKeyDown(Keys.Space); }
      }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    class MissileTouret
    {
      private GameTime fireTime = new GameTime();
     
      private bool firing = false;
      public bool Firing { get { return firing; } }
     
      public bool IsReadyToFire(GameTime currentTime)
      {
        // on doit comparer l'heure courante (en heure de jeu) à une
        // limite de temps. 
        TimeSpan span = currentTime.TotalGameTime - fireTime.TotalGameTime;
     
        // ici, 5000 (5 secondes) est un exemple...
        if (span.Milliseconds < 5000)
        {
          // le dernier tir date d'il y a moins de 5 secondes - on est pas 
          // encore prêt à tirer de nouveau.
          return false;
        }
        else
        {
          return true;
        }
      }
      public Fire(GameTime currentTime)
      {
        // TimeSpan est une structure, donc l'opérateur d'assignation effectue
        // une copie de la valeur : note : on est pas obligé de copier le 
        // GameTime entièrement - seules certaines valeurs nous interessent.
        // Mais bon, histoire d'être comple...
        fireTime.ElapsedGameTime = currentTime.ElapsedGameTime;
        fireTime.ElapsedRealTime = currentTime.ElapsedRealTime;
        fireTime.TotalGameTime = currentTime.TotalGameTime;
        fireTime.TotalRealTime = currentTime.TotalRealTime;
        fireTime.IsRunningSlowly = currentTime.IsRunningSlowly;
     
        // maintenant qu'on a sauvegardé l'heure du tir, on peut effectuer le
        // tir lui-même ; à vous de voir ce que ça fait (ça dépendra de votre 
        // jeu). 
        ...
     
        // on oublie pas qu'on est en mode "Feu à volonté" :)
        firing = true;
      }
     
       public void StopFiring()
       {
         firing = false;
       }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
      ...
      void UpdateFiringState(PlayerControler playerControler, 
                                  GameTime gameTime)
      {
        MissileTouret missileTouret = playerControler.MissileTouret;
     
        if (playerControle.FireButton)
        {
          if (!missileTouret.IsFiring)
          {
            missileTouret.Fire(gameTime);
          }
          else
          {
            if (missileTouret.IsReadToFire(gameTime))
            {
              missileTouret.StartFiring(gameTime);
              missileTouret.Fire(gameTime);
            }
          }
        }
        else
        {
          missileTouret.StopFiring();
        }
      }
      ...
    Dans l'idéal, on doit encapsuler encore davantage ce comportement, de manière à pouvoir généraliser l'appel à Fire() et peut-être ainsi de gérer des types de tourelles différents.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo