Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme avec SDL_GetTicks

je ne vois pas

Sujet résolu
    29 novembre 2008 à 10:00:01

    Bonjour,

    J'ai un probleme avec la gestion du temps alors que d'habitude ça va + ou -, mais la je ne vois pas pourquoi.
    C'est un bout de code où le personnage doit mettre un coup de poing.
    Soit posPoingMoyena le premier mouvement du coup posPoingMoyenb le 2eme et ensuite on reviens sur posPoingMoyena pour revenir.

    Concretement, si resolu vaut 1 tout va bien, le personnage passe de la premiere position à la deuxieme, ensuite si je mets resolu = 0 au lieu d'avoir le personnage qui fait successivement position 1, position 2, position 1(retour du coup de poing), mon personnage reste uniquement sur le position 1 on ne voit meme pas la position 2.
    J'espere que vous aurez compris, sinon n'hésitez pas à me demander.
    Voici le bout de code:
    if(posPoingMoyena.y < 600 && !retour || posrPoingMoyena.y < 600 && !retour)
       {
           tempsActuelad = SDL_GetTicks();
           if(tempsActuelad - tempsPrecedentad > 80)
           {
    
               if(posPoingMoyena.y < 600)
               {
                   posPoingMoyena.x = 2000;
                   posPoingMoyena.y = 2000;
                   posPoingMoyenb.x = 300 - 105;
                   posPoingMoyenb.y = 353;
    
               }
               if(posrPoingMoyena.y < 600)
               {
                   posrPoingMoyena.x = 2000;
                   posrPoingMoyena.y = 2000;
                   posrPoingMoyenb.x = 300 - 116;
                   posrPoingMoyenb.y = 353;
               }
               tempsPrecedentad = tempsActuelad;
           }
       }
    
       if(!resolu)
       {
    
       if(posPoingMoyenb.y < 600 || posrPoingMoyenb.y < 600)
       {
           tempsActuelae = SDL_GetTicks();
           if(tempsActuelae - tempsPrecedentae > 4000) //donc la on est sensé attendre 4 seconde avant que la position extreme du coup de poing soit changée
           {                                           //mais ça n'est pas le cas, on ne voit meme pas la position extreme le personnage reste sur la position intermediaire
               if(posPoingMoyenb.y < 600)              //Alors que si je met que resolu vaut 1, ce que je fais precedemment fonctionne, c'est-à-dire qu'on a le coup de poing jusqu'à son extreme
               {                                        //Mais le soucis ici, est de le faire revenir
                   posPoingMoyenb.x = 2000;
                   posPoingMoyenb.y = 2000;
                   posPoingMoyena.x = 300 - 105;
                   posPoingMoyena.y = 353;
                   retour = 1;
               }
               if(posrPoingMoyenb.y < 600)
               {
                   posrPoingMoyenb.x = 2000;
                   posrPoingMoyenb.y = 2000;
                   posrPoingMoyena.x = 300 - 116;
                   posrPoingMoyena.y = 353;
                   retour = 1;
               }
               tempsPrecedentae = tempsActuelae;
           }
       }
       }
    

    Merci d'avance, si vous voyez quelque chose d'incorrect ce serait sympa de me le dire. :)
    • Partager sur Facebook
    • Partager sur Twitter
      29 novembre 2008 à 10:07:07

      Tu devrais faire un tempsActuel = SDL_GetTicks(); que quand tempsActuel - tempsPrecedent a été > 80. Parce que là, tes conditions empêchent les actions :-°
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        29 novembre 2008 à 10:10:22

        Bonjoue,

        tempsActuelae = SDL_GetTicks();
               if(tempsActuelae - tempsPrecedentae > 4000)
        


        Tu rentres dans ta condition SI le temps du programme - le temps précédent est plus grand que 4 000. L'utilisateur ne va pas attendre 4 secondes puisque l'on rentre directement dans la condition.
        Par contre, si cela fait moins que 4 000, ta condition est ignorée et n'y reviendra pas (sauf s'il y a une boucle, mais je n'en vois pas...)
        Si tu tiens vraiment à faire patienter l'utilisateur, utilise SDL_Delay() ^^
        • Partager sur Facebook
        • Partager sur Twitter
          29 novembre 2008 à 10:16:14

          Merci pour vos reponses,
          J'ai un peu de mal à comprendre en fait.
          Monsieur_JaKy, cela est dans une boucle je te confirme.
          gogohan, les tempsPrecedents ne sont pas les meme, l'un est nommé ad et l'autre ae.
          edit: les 4 secondes sont juste un test pour mieux voir ce qui se passe.


          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            29 novembre 2008 à 10:32:54

            Montre-nous l'endroit où commence ta boucle
            • Partager sur Facebook
            • Partager sur Twitter
              29 novembre 2008 à 10:36:32

              Desolé le code fait 8425 lignes, mais ce que je ne comprends pas c'est que j'ai l'habitude de faire comme ça, j'ai tout geré comme ça, les sauts, la marche, la course etc... meme les ennemis sont gerés comme ça.
              A mon avis le probleme se trouve plutot du coté du booléen "retour".
              Je cherche, je cherche...
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                29 novembre 2008 à 10:41:02

                8425 lignes...
                Heuresement que le découpage en fonction existe :p
                • Partager sur Facebook
                • Partager sur Twitter
                  29 novembre 2008 à 10:43:12

                  Oui la j'avoue que c'est pas pro dutout.
                  Bon en fait ça viendrait pas du booléen "retour".
                  J'ai fait un petit teste, c'est le 4000 qui n'est pas écouté c'est étrange c'est comme si j'avais écrit 10 au lieu de 4000 quasiment.
                  ___________________________________
                  edit: probleme resolu, gogohan avait raison (aussi), ça ne me parraissait d'ailleur pas évident pourtant...j'y refléchis encore o_O ...
                  voila le code qui fonctionne:
                  if(posPoingMoyena.y < 600 && !retour || posrPoingMoyena.y < 600 && !retour)
                      {
                  
                         tempsActuelad = SDL_GetTicks();
                         if(tempsActuelad - tempsPrecedentad > 30)
                         {
                  
                             if(posPoingMoyena.y < 600 && !retour)
                             {
                                 posPoingMoyena.x = 2000;
                                 posPoingMoyena.y = 2000;
                                 posPoingMoyenb.x = 300 - 105;
                                 posPoingMoyenb.y = 353;
                  
                  
                             }
                             if(posrPoingMoyena.y < 600 && !retour)
                             {
                                 posrPoingMoyena.x = 2000;
                                 posrPoingMoyena.y = 2000;
                                 posrPoingMoyenb.x = 300 - 116;
                                 posrPoingMoyenb.y = 353;
                  
                             }
                             tempsPrecedentad = tempsActuelad;
                  
                         }
                         else
                                      {
                                          SDL_Delay(30 - (tempsActuelad - tempsPrecedentad));
                                      }
                  
                      }
                  
                  
                  
                  
                       if(posPoingMoyenb.y < 600 || posrPoingMoyenb.y < 600)
                       {
                         tempsActuelae = SDL_GetTicks();
                         if(tempsActuelae - tempsPrecedentae > 60)
                         {
                             if(posPoingMoyenb.y < 600)
                             {
                  
                                 posPoingMoyenb.x = 2000;
                                 posPoingMoyenb.y = 2000;
                                 posPoingMoyena.x = 300 - 105;
                                 posPoingMoyena.y = 353;
                                 retour = 1;
                             }
                             if(posrPoingMoyenb.y < 600)
                             {
                  
                                 posrPoingMoyenb.x = 2000;
                                 posrPoingMoyenb.y = 2000;
                                 posrPoingMoyena.x = 300 - 116;
                                 posrPoingMoyena.y = 353;
                                 retour = 1;
                  
                             }
                             tempsPrecedentae = tempsActuelae;
                         }
                  
                       else
                                      {
                                          SDL_Delay(60 - (tempsActuelae - tempsPrecedentae));
                                      }
                       }
                  

                  reste à savoir si le SDL_Delay ne va pas gener l'adversaire pwwaaaa :lol:
                  Merci à vous 2 ^^ !
                  • Partager sur Facebook
                  • Partager sur Twitter

                  probleme avec SDL_GetTicks

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown