Partage
  • Partager sur Facebook
  • Partager sur Twitter

Combiner SDL_PollEvent et sleep

Sujet résolu
    20 avril 2019 à 11:11:37

    Bonjour à tous,

    Je débute en C et après avoir fait l'excellent tuto de Mateo21 je me suis dit qu'un bon entraînement pour aller plus loin serait de refaire un vieux jeu en 2D sur SNES, les sprites étant faciles à trouver. Le problème que je rencontre est que je n'arrive pas à faire en sorte que la boucle principale ne soit bouclée que 50 fois par seconde avec un sleep sans entraver mon SDL_PollEvent qui gère les événements clavier.

    Je cherche à exécuter cette boucle 50 fois par seconde pour respecter les changements de sprites pour faire l'animation, peut-être que je m'y prends mal et qu'il y a d'autres méthodes.

    Voici un extrait du code :

    int continuer = 1;
    while (continuer)
    {
        //animations changeant en fonction d'un compteur dans la boucle
       
        SDL_PollEvent(&event);
       
        switch (event.type)
        {
            //événements clavier
        }
       
        sleep(20);
    }



    Avec ce sleep je ne peux pas interagir car forcément ca dort pendant le gros de l'exécution, mais sans ca, la boucle tourne à toute vitesse et bouffe le processeur, comment je peux faire ?

    Merci à tous pour votre aide

    -
    Edité par CookieEater 20 avril 2019 à 11:15:31

    • Partager sur Facebook
    • Partager sur Twitter
      20 avril 2019 à 15:56:20

      Salut,

      Je pense que tu as élaboré une théorie sans même avoir fait l'essai. Tout le monde utilise ce système sans pour autant avoir de problème avec la gestions des événements puisque la pile d'évent est alimentée même lorsque le le programme est en pause.

      Ton problème vient surtout d'une mauvaise utilisation du dépilage qui devrait ressembler à quelque chose comme ça :

      while (SDL_PollEvent(&event))
          {
              switch (event.type)
              {
                ...
              }
          }

      Ceci permettant donc de parcourir toute la pile d'événement sur un même cycle programme. Je t'invite à aller voir ce tuto.

      Également il serait préférable d'utiliser SDL_Delay() plutôt qu'un sleep(), histoire d'être standard.

      De plus pour avoir un taux de fps constant, il faut tenir compte du temps d'exécution du code qu'il faut déduire de tes 20ms avec un truc qui ressemble à ça en fin de boucle :

      syncAct = SDL_GetTicks();
      
              if((syncAct - syncPrev)<20)
              {
                  //printf("cycle = %d\n", syncAct - syncPrev);
                  SDL_Delay(20 - (syncAct - syncPrev));
                  syncPrev = syncAct;
              }
              else
                  syncPrev = syncAct;

      Pour ce qui est d'avoir des animations avec des intervalles d'images corrects, il suffit de faire en sorte que ces animations ne dépendent pas de la vitesse de cycle du programme et devraient donc posséder leur propre synchronisation.

      Bonne continuation.

      -
      Edité par drx 20 avril 2019 à 16:07:10

      • Partager sur Facebook
      • Partager sur Twitter

      Stringman | Jeux de plateforme : Nouvelle Démo.

        20 avril 2019 à 21:06:07

        Merci pour ta réponse, en effet je suis parti du mauvais pied. Du coup pour les animations tu penses à l'utilisation de SDL_AddTimer ? C'est vrai que déjà ca rendra la fonction plus propre. Je vais me pencher sur tout ca merci encore
        • Partager sur Facebook
        • Partager sur Twitter
          20 avril 2019 à 23:05:45

          non, je ne pense pas à SDL_AddTimer, un simple comparateur fait l'affaire :

          now = SDL_GetTicks()
          
          if (now-prevTime >= 100)//si au moins 100ms
          {
             actPic = (actPic+1)%numOfPic; //image suivante modulo nombre d'image pour boucler
             prevTime = now; //memoriser temps actuel pour comparaison suivante
          }
             

          pour une animation à 100ms par image.

          • Partager sur Facebook
          • Partager sur Twitter

          Stringman | Jeux de plateforme : Nouvelle Démo.

          Combiner SDL_PollEvent et sleep

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          • Editeur
          • Markdown