Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fenêtre qui ne s'affiche pas avec SDL_Delay (OS X)

    17 avril 2016 à 1:38:03

    Bonjour,

    Alors voilà, je me suis mis à la SDL2 en langage C et j'ai déjà un problème (sous OS X)... Les programmes de base, lorsqu'on débute, utilisent la fonction SDL_Delay histoire d'avoir le temps de voir un écran noir s'afficher et se rendre compte que tout marche bien. Problème : moi quand j'utilise SDL_Delay, la fenêtre ne s'affiche pas. En revanche, je n'ai aucun problème de compilation, et le programme à l'air de s'exécuter normalement (j'ai même la petite image sur le dock qui m'indique qu'il y a une fenêtre ouverte, et tout ça dure exactement le même temps que j'ai passé en paramètre à la fonction SDL_Delay), il y a juste la fenêtre que je ne vois pas s'afficher.

    J'ai alors essayé la fonction "pause" sur le cours du langage C, et là ça fonctionne, je vois bien la fenêtre s'afficher.

    Mais bon, j'aimerais quand même réussir à utiliser la fonction SDL_Delay qui m'a l'air bien pratique...

    Merci d'avance pour les réponses que vous m'apporterez !

    Voici le code avec SDL_Delay qui bug : 

    #include <SDL.h>
    #include <stdio.h>
    #define WIDTH 640
    #define HEIGHT 480
    #define NAME "Ma première application SDL2"
    
    int main(int argc, char** argv)
    {
        /* Initialisation simple */
        if (SDL_Init(SDL_INIT_VIDEO) != 0)
        {
            printf("Erreur SDL : %s\n", SDL_GetError());
            return (-1);
        }
        else
        {
            /* Création de la fenêtre */
            SDL_Window* pWindow = NULL;
            pWindow = SDL_CreateWindow(
            NAME,
            	SDL_WINDOWPOS_UNDEFINED,
            	SDL_WINDOWPOS_UNDEFINED,
            	WIDTH,
            	HEIGHT,
            	SDL_WINDOW_SHOWN
            );
            if (pWindow)
            {
    		/* Attendre trois secondes */
    		SDL_Delay(3000);
    		SDL_DestroyWindow(pWindow);
            }
            else
            	printf("Erreur : %s\n", SDL_GetError());
        }
        SDL_Quit();
        return (0);
    }
    

    Et voici celui qui marche, sans SDL_Delay : 

    #include <SDL.h>
    #include <stdio.h>
    #define WIDTH 640
    #define HEIGHT 480
    #define NAME "Ma première application SDL2"
    
    void paus()
    {
        int continuer = 1;
        SDL_Event event;
    
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
            }
        }
    }
    
    
    int main(int argc, char** argv)
    {
        /* Initialisation simple */
        if (SDL_Init(SDL_INIT_VIDEO) != 0)
        {
            printf("Erreur SDL : %s\n", SDL_GetError());
            return (-1);
        }
        else
        {
            /* Création de la fenêtre */
            SDL_Window* pWindow = NULL;
            pWindow = SDL_CreateWindow(
            NAME,
            	SDL_WINDOWPOS_UNDEFINED,
            	SDL_WINDOWPOS_UNDEFINED,
            	WIDTH,
            	HEIGHT,
            	SDL_WINDOW_SHOWN
            );
            if (pWindow)
            {
    		/* Attendre trois secondes
    		SDL_Delay(3000);*/
        paus();
    		SDL_DestroyWindow(pWindow);
            }
            else
            	printf("Erreur : %s\n", SDL_GetError());
        }
        SDL_Quit();
        return (0);
    }
    



    • Partager sur Facebook
    • Partager sur Twitter
      16 août 2016 à 23:15:02

      salut !! je me permet de relancer le sujet vu qu' il n' est pas très vieux, car j' ai le meme soucis ! si tu as trouvé la solution je suis preneur !! merci !
      • Partager sur Facebook
      • Partager sur Twitter
        19 août 2016 à 0:40:16

        Non je n'ai pas trouvé de solution. Mais je te renvoie vers ce lien. J'ai lancé le même topic sur le site developpez et j'ai obtenu une réponse.
        • Partager sur Facebook
        • Partager sur Twitter
          19 août 2016 à 8:55:32

          PLop !
          SDL_WaitEvent libère le processus pendant l'attente avec un SDL_Delay

          int //extrait des sources de la SDL2
          SDL_WaitEvent(SDL_Event * event)
          {
              return SDL_WaitEventTimeout(event, -1);
          }
          
          int
          SDL_WaitEventTimeout(SDL_Event * event, int timeout)
          {
              Uint32 expiration = 0;
          
              if (timeout > 0)
                  expiration = SDL_GetTicks() + timeout;
          
              for (;;) {
                  SDL_PumpEvents();
                  switch (SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) {
                  case -1:
                      return 0;
                  case 1:
                      return 1;
                  case 0://pas d'event et pas d'erreur
                      if (timeout == 0)//pas d'attente ? (SDL_PollEvent utilisé ?)
                      {
                          /* Polling and no events, just return */
                          return 0;
                      }
                      if (timeout > 0 && SDL_TICKS_PASSED(SDL_GetTicks(), expiration)//temps à attente a expiré
                      {
                          /* Timeout expired and no events */
                          return 0;
                      }
                      //sinon on attend pour libérer le CPU car on a rien d'autre à faire  
                      SDL_Delay(10);
                      break;
                  }
              }
          }
          

          SDL_Delay ne bloque pas le process à 100% (juste un minimum de 10ms par frame dans ton cas).

          SDL_CreateWindow renvoie le pointeur de la fenêtre crée, pour que le retour de la fonction soit correcte, il est necessaire que la fonction est testé tout les cas potentiel d'erreur lors de la création de la fenêtre PUIS retourner le pointeur.
          La fenêtre a alors le temps de se créer quoi qu'il arrive...

          https://openclassrooms.com/forum/sujet/probleme-d-affichage-fenetre-sous-xcode-6

          Peut être ce lien pourra t'aider (je n'ai pas encore coder sous mac  pour avoir la réponse à ton problème)

          Sinon une pause tant qu'on n'appuie pas sur une touche du claver ou bien un temps max.

          //exemple pauseClavier(10000);
          //attendre l'appuie d'une touche ou bien 10 secondes
          
          void pauseClavier(Uint32 tempsMax)//-1=infini
          {
           SDL_Event ev;
           //on attend un event et si cet event est l'appuie d'une touche, on sort de la boucle.
           //si tempsMax est dépassé, on sort aussi de la boucle (WaitEventTimeout reverra 0 == faux pour une condition  )
           while(SDL_WaitEventTimeout(&ev,tempsMax)&&ev.type!=SDL_KEYDOWN);
          }

          -
          Edité par neuneutrinos 19 août 2016 à 9:00:08

          • Partager sur Facebook
          • Partager sur Twitter
            9 août 2019 à 13:10:26

            Bonjour,

            Pour ma part j'ai remplacé SDL_Delay par SDL_WaitEventTimeout, et la fenêtre d'affiche. la fonction retourne 0 si le timeout est déclenché, 1 sinon (et dans ce cas je peux traiter un event, par exemple la demande de fermeture de l'appli)

            SDL_Event event;
            while (SDL_WaitEventTimeout(&event, 10) == 0)
            {
               // du code
            }
            
            // je traite l'event
            switch(event.type)
            {
                case SDL_QUIT:
                    break;
            }
            



            • Partager sur Facebook
            • Partager sur Twitter

            Fenêtre qui ne s'affiche pas avec SDL_Delay (OS X)

            × 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