Partage
  • Partager sur Facebook
  • Partager sur Twitter

Fenêtre SDL qui s'ouvre pas !

Sujet résolu
    26 mai 2006 à 20:34:37

    Bonjour,

    J'ai pris un peu de retard sur les cours de Mateo, et donc je me remet un peu au C.

    J'attaque le chapitre sur le temps ;)
    Je suis entrain de taper le code de base pour ouvrir une fenêtre SDL, et la fenêtre ne s'ouvre pas (je suis déja bien barré :x)

    Il ne m'affiche aucune erreur, mais ma fenêtre ne s'ouvre pas, voici mon code:

    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>

    int main(int argc, char *argv[])
    {
        //Déclaration & initialisation de nos fonctions
        SDL_Event event;
        SDL_Surface *ecran = NULL;
        int continuer = 1;

        SDL_Init(SDL_INIT_VIDEO); //Ouverture de la SDL
        //On ouvre une fenêtre
        SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);
        //On donne un titre a notre fenêtre
        SDL_WM_SetCaption("Le temps avec la SDL", NULL);

        //On entre dans les evenements
        while(continuer)
        {
            SDL_WaitEvent(&event);
            switch (event.type)
            {
                case SDL_QUIT:
                continuer = 0;
                break;

                case SDL_KEYDOWN:
                switch (event.key.keysym.sym)
                {
                    SDLK_ESCAPE:
                    continuer = 0;
                    break;
                }
                break;
            }
            SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,250,250,250));
            SDL_Flip(ecran);
        }

        SDL_Quit(); //On quitte la SDL pour vider la mémoire
        return EXIT_SUCCESS;
    }



    Voila, donc je voulais savoir pourquoi ma fenêtre ne s'ouvre pas, j'ai testé un code de Mateo, et même avec son code sa ne s'ouvre pas, donc j'ai du oublier de faire une manip ;)

    A+

    • Partager sur Facebook
    • Partager sur Twitter
      26 mai 2006 à 20:39:21

      Bonjour.
      SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);

      Tu crois pas que ça devrais être ça :
      ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);

      Erreur très courante ;) .
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        26 mai 2006 à 20:40:38

        Citation : Jojo

        SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);


        Il faudrait mettre:

        ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);


        Sinon ça bloque là:

        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,250,250,250));


        Et là:

        SDL_Flip(ecran);
        • Partager sur Facebook
        • Partager sur Twitter
          26 mai 2006 à 21:10:55

          Et si je ne me trompe pas, il faut initialiser la SDL avant de déclarer quoique ce soit qui ait un rapport avec.
              SDL_Init(SDL_INIT_VIDEO);
             
              SDL_Event event;
              SDL_Surface *ecran = NULL;
              int continuer = 1;

              ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);
          • Partager sur Facebook
          • Partager sur Twitter
            26 mai 2006 à 21:17:00

            Ca marche aussi en faisant le contraire:

               
                SDL_Event event;
                SDL_Surface *ecran = NULL;
                int continuer = 1;

                SDL_Init(SDL_INIT_VIDEO);

                ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);
            • Partager sur Facebook
            • Partager sur Twitter
              26 mai 2006 à 21:23:37

              il ne manquerait pas un case dans le deuxieme switch :
              #include <stdlib.h>
              #include <stdio.h>
              #include <SDL/SDL.h>
              #include <SDL/SDL_image.h>

              int main(int argc, char *argv[])
              {
                  //Déclaration & initialisation de nos fonctions
                  SDL_Event event;
                  SDL_Surface *ecran = NULL;
                  int continuer = 1;

                  SDL_Init(SDL_INIT_VIDEO); //Ouverture de la SDL
                  //On ouvre une fenêtre
                  SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);
                  //On donne un titre a notre fenêtre
                  SDL_WM_SetCaption("Le temps avec la SDL", NULL);

                  //On entre dans les evenements
                  while(continuer)
                  {
                      SDL_WaitEvent(&event);
                      switch (event.type)
                      {
                          case SDL_QUIT:
                          continuer = 0;
                          break;

                          case SDL_KEYDOWN:
                          switch (event.key.keysym.sym)
                          {
                              case SDLK_ESCAPE://le case manquant ici
              /*si il n'y est pas 'SDLK_ESCAPE:' est considéré comme un label, il est passé par le prog qui execute 'continuer=0;', ce qui ferme le prog peu apres: tu ne voit rien s'afficher, ca s'ouvre et disparait trop rapidement.*/
                              continuer = 0;
                              break;
                          }
                          break;
                      }
                      SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,250,250,250));
                      SDL_Flip(ecran);
                  }

                  SDL_Quit(); //On quitte la SDL pour vider la mémoire
                  return EXIT_SUCCESS;
              }
              • Partager sur Facebook
              • Partager sur Twitter
                26 mai 2006 à 21:31:02

                Merci pour vos réponse, j'ai modifier ce que vous m'avez dit, par contre je ne voie pas d'erreur sur la focntion SDL_FillRect :o

                je vous remet mon code:


                #include <stdlib.h>
                #include <stdio.h>
                #include <SDL/SDL.h>
                #include <SDL/SDL_image.h>

                int main(int argc, char *argv[])
                {
                    //Déclaration & initialisation de nos fonctions
                    SDL_Event event;
                    SDL_Surface *ecran = NULL;
                    int continuer = 1;

                    SDL_Init(SDL_INIT_VIDEO); //Ouverture de la SDL
                    //On ouvre une fenêtre
                    ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);
                    //On donne un titre a notre fenêtre
                    SDL_WM_SetCaption("Le temps avec la SDL", NULL);

                    //On entre dans les evenements
                    while(continuer)
                    {
                        SDL_WaitEvent(&event);
                        switch (event.type)
                        {
                            case SDL_QUIT:
                            continuer = 0;
                            break;

                            case SDL_KEYDOWN:
                            switch (event.key.keysym.sym)
                            {
                                case SDLK_ESCAPE:
                                continuer = 0;
                                break;
                            }
                            break;
                        }
                        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,250,250,250));
                        SDL_Flip(ecran);
                    }

                    SDL_Quit(); //On quitte la SDL pour vider la mémoire
                    return EXIT_SUCCESS;
                }


                A votre avis sa vient du code, ou bien c'est un truc qu'il faut modifier sur mon editeur ?

                A+
                • Partager sur Facebook
                • Partager sur Twitter
                  26 mai 2006 à 21:31:27

                  Aucune erreur a signaler ;) .
                  • Partager sur Facebook
                  • Partager sur Twitter
                    26 mai 2006 à 21:40:15

                    Par conséquent, faut-il que je fasse qqch de spécial (une manip ou autre) ?

                    A+
                    • Partager sur Facebook
                    • Partager sur Twitter
                      26 mai 2006 à 21:46:58

                      Ce code fonctionne a merveille, a un détail prêt :
                      #include <stdlib.h>
                      #include <stdio.h>
                      #include <SDL/SDL.h>
                      #include <SDL/SDL_image.h>

                      int main(int argc, char *argv[])
                      {
                          //Déclaration & initialisation de nos fonctions
                          SDL_Event event;
                          SDL_Surface *ecran = NULL;
                          int continuer = 1;

                          SDL_Init(SDL_INIT_VIDEO); //Ouverture de la SDL
                          //On ouvre une fenêtre
                          ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);
                          //On donne un titre a notre fenêtre
                          SDL_WM_SetCaption("Le temps avec la SDL", NULL);

                          //On entre dans les evenements
                          while(continuer)
                          {
                              SDL_WaitEvent(&event);
                              switch (event.type)
                              {
                                  case SDL_QUIT:
                                  continuer = 0;
                                  break;

                                  case SDL_KEYDOWN:
                                  switch (event.key.keysym.sym)
                                  {
                                      case SDLK_ESCAPE:
                                      continuer = 0;
                                      break;
                                  }
                                  break;
                              }
                      //Pour avoir un blanc parfait, c'est un 255 qu'il faut mettre
                              SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
                              SDL_Flip(ecran);
                          }

                          SDL_Quit(); //On quitte la SDL pour vider la mémoire
                          return EXIT_SUCCESS;
                      }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        26 mai 2006 à 21:52:50

                        Salut, juste un question :

                        est ce que tu as bien " installé " la SDL ? enfin je veux dire, est ce que tu es sûr de ne pas t'être trompé?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          26 mai 2006 à 22:21:05

                          son probléme est réglé je crois :) par contre initialiser les variables à null n'est pas du tout indispensable :)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            26 mai 2006 à 22:35:29

                            Heu non mon problème n'est pas réglé !

                            Sinon oui j'ai installé la SDL comme même^^

                            Mais bon la fenêtre ne s'ouvre pas :(

                            A+
                            • Partager sur Facebook
                            • Partager sur Twitter
                              27 mai 2006 à 16:22:31

                              Dans mon cas, le dernier code cité (je le remet pour être sûr qu'il n'y ait pas d'ambiguité) marche à la perfection.


                              #include <stdlib.h>
                              #include <stdio.h>
                              #include <SDL/SDL.h>
                              #include <SDL/SDL_image.h>

                              int main(int argc, char *argv[])
                              {
                                  //Déclaration & initialisation de nos fonctions
                                  SDL_Event event;
                                  SDL_Surface *ecran = NULL;
                                  int continuer = 1;

                                  SDL_Init(SDL_INIT_VIDEO); //Ouverture de la SDL
                                  //On ouvre une fenêtre
                                  ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE |SDL_DOUBLEBUF);
                                  //On donne un titre a notre fenêtre
                                  SDL_WM_SetCaption("Le temps avec la SDL", NULL);

                                  //On entre dans les evenements
                                  while(continuer)
                                  {
                                      SDL_WaitEvent(&event);
                                      switch (event.type)
                                      {
                                          case SDL_QUIT:
                                          continuer = 0;
                                          break;

                                          case SDL_KEYDOWN:
                                          switch (event.key.keysym.sym)
                                          {
                                              case SDLK_ESCAPE:
                                              continuer = 0;
                                              break;
                                                             
                                                              default:
                                                                      break;
                                          }
                                          break;
                                                      default:
                                                              break;
                                      }
                              //Pour avoir un blanc parfait, c'est un 255 qu'il faut mettre
                                      SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));
                                      SDL_Flip(ecran);
                                  }

                                  SDL_Quit(); //On quitte la SDL pour vider la mémoire
                                  return EXIT_SUCCESS;
                              }


                              Sinon, tu es sûr que tu as bien mit toutes les options qu'il fallait dans ton linker ? ça peut être une source d'erreurs, mais à priori si la compilation se passe bien, ça viens pas de ça...

                              Sinon, je lit dans ce topic que si il n'y a pas le "ecran = " devant SDL_SetVideoMode vous criez tous, alors qu'il n'y a pas de raison : on peut ne pas avoir cette surface du tout en utilisant la fonction SDL_GetVideoSurface(); Mais bon, M@teo n'en parle pas dans son cours... Ca permet néanmoins de gagner une variable...

                              Si ce code marche pas, que tu obtiens bien ton fichier exécutable, je sais pas vraiment ce qui peut ne pas marcher... C'est bizarre cette histoire. Tu as bien la dll de sdl dans ton repertoire windows ou a coté de ton exécutable ? (dans le cas contraire il te sortirais une erreur du style "point d'entrée de SDL_GetError introuvable !").

                              Voila, bon courage.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                27 mai 2006 à 16:42:15

                                #include <stdlib.h>
                                /* #include <stdio.h>
                                Header inutile ? */

                                #include <SDL/SDL.h>
                                /* #include <SDL/SDL_image.h>
                                Inutile ? */


                                int main(int argc, char *argv[])
                                {
                                    /* Ce ne sont pas des fonctions mais des variables qui viennent ici */
                                    SDL_Event event;
                                    SDL_Surface *ecran = NULL;
                                    int continuer = 1;

                                    /* Initialisation du sous-système vidéo de SDL */
                                    SDL_Init(SDL_INIT_VIDEO);

                                    /* Crée la surface vidéo */
                                    ecran = SDL_SetVideoMode(640,480,32,SDL_HWSURFACE|SDL_DOUBLEBUF);

                                    /* Donne un titre */
                                    SDL_WM_SetCaption("Le temps avec la SDL", NULL);

                                    /* Boucle principale */
                                    while(continuer)
                                    {
                                        /* Attend qu'un événement soit reçu par l'application */
                                        SDL_WaitEvent(&event);

                                        /* Suivant le type de l'événement */
                                        switch (event.type)
                                        {
                                            /* Quitter */
                                            case SDL_QUIT:
                                                continuer = 0;
                                                break;

                                            /* Appui sur une touche */
                                            case SDL_KEYDOWN:
                                                switch (event.key.keysym.sym)
                                                {
                                                    case SDLK_ESCAPE:
                                                        continuer = 0;
                                                        break;
                                                }
                                                break;
                                        }

                                        /* Chaque composante d'une couleur RGB étant sur un octet,
                                         * Le maximum est bien 255 et non 250
                                         * La présence de cette instruction dans la boucle n'est
                                         * pas justifiée                                           */

                                        SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,255,255,255));

                                        /* Flip */
                                        SDL_Flip(ecran);
                                    }

                                    /* Quitte proprement SDL */
                                    SDL_Quit();

                                    /* Fin du programme */
                                    return EXIT_SUCCESS;
                                }


                                Si ce code ne marche pas, merci de préciser les éventuelles erreurs de compilation, d'exécution ou autre.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  27 mai 2006 à 16:45:29

                                  Aucun de vos code ne marche.

                                  je veux dire, qu'il ne me met aucune erreur, il me met sa :

                                  Citation : Ecriture

                                  Switching to target: default
                                  Compiling: main.c
                                  Linking console executable: SDLapp.exe
                                  .objs\main.o:main.c:(.text+0x0): multiple definition of `SDL_main'
                                  .objs\main.o:main.c:(.text+0x0): first defined here
                                  collect2: ld returned 1 exit status
                                  Process terminated with status 1 (0 minutes, 0 seconds)



                                  Mais il n'ouvre pas de fenêtre, il ne bouge pas !

                                  A+
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    27 mai 2006 à 17:40:08

                                    tu as mit quoi comme option dans ton linker ?
                                    Je compile avec ces options passée à mingw, et ça marche...


                                    gcc main.c -o fichier.exe -Wall -std=gnu99 -lmingw32 -lsdlmain -lsdl -mwindows


                                    Sachant que main.c contient le code cité ci-dessus. Le problème viens de ton compilateurs qui n'as pas les bonnes options je pense...
                                    Met ça dans ton linker : "-lmingw32 -lsdlmain -lsdl" et ça devrait marcher.

                                    Bon courage.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      27 mai 2006 à 18:00:55

                                      Merci de ton aide !

                                      En faite le logiciel se met tout seul en "Console Application", alors qu'il faut qu'il soit en "Gui Application", c'était donc sa qui faisait planter !

                                      A+ et merci :)
                                      • Partager sur Facebook
                                      • Partager sur Twitter

                                      Fenêtre SDL qui s'ouvre pas !

                                      × 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