Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL & LINUX]La fenetre n'affiche rien

Sauf si on "force" le rafraichissement...

    19 mars 2006 à 22:27:50

    Salut à tous !
    Je suis en ce moment sous Linux Ubuntu, et j'essaye de programmer en C...
    J'utilise emacs et g++, mais ça on s'en fout (du moins je crois)

    Lors des trucs en SDL, je me demandais pourquoi ma fenêtre restait noire quoi que je fasse...
    Et bah en fait, elle reste noire tant qu'on a pas fait un truc qui lui demande explicitement de raffraichir, comme passer une fenetre devant, la faire sortir de l'écran puis revenir, etc... (sauf si, évidement, elle est sensée être noire ^_^)

    Bon, c'est pas mortel, il suffit de faire bouger la fenetre un peu après avoir lancé le programme, mais c'est quand même assez chiant...

    Quelqu'un a une solution ?...
    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2006 à 23:04:42

      mmm etrange ca ... ce quoi ton code?
      • Partager sur Facebook
      • Partager sur Twitter
        19 mars 2006 à 23:05:05

        Tu as de la chance, moi je n'ai que les bordures. Ma fenêtre est transparente à l'interieur ! ^^
        • Partager sur Facebook
        • Partager sur Twitter
          19 mars 2006 à 23:08:34

          Citation : zedtux

          Tu as de la chance, moi je n'ai que les bordures. Ma fenêtre est transparente à l'interieur ! ^^



          Tu a du oublier du code toi ^^
          • Partager sur Facebook
          • Partager sur Twitter
            19 mars 2006 à 23:09:57

            Ca a l'air cool linux! xD
            • Partager sur Facebook
            • Partager sur Twitter
              19 mars 2006 à 23:11:54

              J'ai remarqué le même problème sous kubuntu...

              De mémoire avec XWindows il faut rafraichir la fenêtre après sa création.
              Peut être qu'il faut faire pareil avec la SDL...

              Edit: euh, j'ai re regardé mes codes de serverX et en fait non, rien de spécial à faire :-°
              • Partager sur Facebook
              • Partager sur Twitter
                19 mars 2006 à 23:18:00

                Citation : belfo

                Citation : zedtux

                Tu as de la chance, moi je n'ai que les bordures. Ma fenêtre est transparente à l'interieur ! ^^



                Tu a du oublier du code toi ^^



                o_O Copier coller du cour de matéo..
                • Partager sur Facebook
                • Partager sur Twitter
                  19 mars 2006 à 23:23:24

                  Hum, ça ne rafraîchit peut-être pas tout seul.
                  Essaie de faire les blits à chaque tour de boucle dans la fonction pause.

                  J'y crois pas trop mais on sait jamais !
                  • Partager sur Facebook
                  • Partager sur Twitter

                  If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                    19 mars 2006 à 23:24:02

                    etrange ...


                    Je pense que une ligne de code manque, pour refrechire la fenetre apres le chargement.
                    Mais je ne suis pas sur, j'adment ne pas faire du SDL a longuer de journee ^^
                    • Partager sur Facebook
                    • Partager sur Twitter
                      19 mars 2006 à 23:29:24

                      Voila le résultat :

                      Image utilisateur


                      EDIT : Je vient de trouver un code qui marche sous mon linux !

                      Je voie des différences avec le cours de mateo.. mais je voie pas pourquoi...
                      Peut etre que votre oeil expert verra quelque chose ! ^^

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

                      // Surfaces et rectangle
                      SDL_Rect rect;
                      SDL_Surface *Screen, *rectangle;

                      // Fonction d'affichage
                      void affichage()
                      {
                         // Coloration des surfaces
                         SDL_FillRect(rectangle, NULL,
                            SDL_MapRGB(Screen->format, 255, 0, 0));
                         SDL_FillRect(Screen, NULL, 0);

                         // Définition de la zone à l'écran
                         rect.x = (Screen->w / 2) - (rect.w / 2);
                         rect.y = (Screen->h / 2) - (rect.h / 2);
                         rect.w = Screen->w / 2;
                         rect.h = Screen->h / 2;

                         // Blit de la surface à l'écran et affichage
                         SDL_BlitSurface(rectangle,NULL,Screen,&rect);
                         SDL_Flip(Screen);
                      }

                      int main (int argc, char **argv)
                      {
                         // Initialisation de SDL
                         if (SDL_Init (SDL_INIT_VIDEO) < 0) {
                            fprintf (stderr, "Erreur d'initialisation de SDL: %s\n",
                               SDL_GetError ());
                            return 1;
                         }
                         atexit (SDL_Quit); // Pour quitter proprement

                         // Initialisation de SDL_Video
                         Screen = SDL_SetVideoMode (640, 480, 16, SDL_SWSURFACE);
                         if (Screen == NULL) {
                            fprintf (stderr, "Erreur d'initialisation du mode video: %s\n",
                               SDL_GetError ());
                            return 2;
                         }

                         // Allocation de la surface (pour l'instant vide)
                         rectangle = SDL_CreateRGBSurface(SDL_SWSURFACE,
                            320, 240, 32,
                            0, 0, 0, 0);

                         // Titre de fenêtre
                         SDL_WM_SetCaption ("Première appli SDL", NULL);

                         // Boucle infinie
                         while (1)
                         {
                            SDL_Event event; // Fermer la fenêtre proprement
                            if (SDL_PollEvent (&event) && event.type==SDL_QUIT)
                               break;
                            affichage(); // Mise à jour de l'écran
                         }

                         // Libération de la surface rectangle
                         SDL_FreeSurface(rectangle);
                         return 0;
                      }


                      Ce qui donne :

                      Image utilisateur


                      Soit c'est la fonction SDL_CreateRGBSurface ( mais je doute .. ) soit c'est le fais de rafraichir comme disais Gyscos avec la fonction affichage().


                      EDIT 2: Pour toi Gyscos, je croix que tu doit faire absolument un while dans lequel tu appele SDL_UpdateRect ( void SDL_UpdateRect(SDL_Surface *screen, Sint32 x, Sint32 y, Sint32 w, Sint32 h); )
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 mars 2006 à 7:37:45

                        Euh j'ai vu un autre code sur internet où ils utilisent un SDL_Flip(ecran) (et plein d'autres trucs mais c'est surtout ca la difference...)

                        Ca pourrait être ça ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          20 mars 2006 à 7:56:25

                          Ben la différence que je vois sur le code plus haut c'est effectivement un SDL_Flip.

                          Je teste tout de suite

                          EDIT: effectivement ça marche beaucoup mieux :)
                          Voila le code du dégradé:
                          #include <stdlib.h>
                          #include <stdio.h>
                          #include <SDL/SDL.h>

                          void pause();

                          int main(int argc, char *argv[])
                          {
                                  SDL_Surface *ecran = NULL, *lignes[256] = {NULL};
                                  SDL_Rect position;
                                  int i = 0;

                                  SDL_Init(SDL_INIT_VIDEO);

                                  ecran = SDL_SetVideoMode(640, 256, 32, SDL_HWSURFACE); // Hauteur de 256 pixels
                                                  SDL_WM_SetCaption("Mon dégradé en SDL !", NULL);

                                                  for (i = 0 ; i <= 255 ; i++)
                                                          lignes[i] = SDL_CreateRGBSurface(SDL_HWSURFACE, 640, 1, 32, 0, 0, 0, 0); // Allocation des 256 surfaces

                                                                         

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

                                                                          for (i = 0 ; i <= 255 ; i++)
                                                                          {
                                                                                  position.x = 0; // Les lignes sont à gauche (abscisse de 0)
                                                                                                  position.y = i; // La position verticale dépend du numéro de la ligne actuelle
                                                                                                          SDL_FillRect(lignes[i], NULL, SDL_MapRGB(ecran->format, i, i, i)); // Remplissage
                                                                                                          SDL_BlitSurface(lignes[i], NULL, ecran, &position); // Collage
                                                                          }
                                                                         
                                                                          /*---------Ligne ajoutée---------------*/
                                                                          SDL_Flip(ecran);
                                                                          /*---------Ligne ajoutée---------------*/
                                                                         
                                                                          pause();

                                                                          for (i = 0 ; i <= 255 ; i++) // N'oubliez pas de libérer chacune des 256 surfaces !
                                                                                                  SDL_FreeSurface(lignes[i]);
                                                                          SDL_Quit();

                                                                          return EXIT_SUCCESS;
                          }

                          void pause()
                          {
                                  int continuer = 1;
                                  SDL_Event event;

                                  while (continuer)
                                  {
                                          SDL_WaitEvent(&event);
                                          switch(event.type)
                                          {
                                                  case SDL_QUIT:
                                                          continuer = 0;
                                          }
                                  }
                          }
                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 mars 2006 à 11:28:10

                            En effet, une fois sur 4 avec ta fonction pause, le contenu de la fenêtre s'affiche et le reste du temps, on a un beau carré noir :(
                            • Partager sur Facebook
                            • Partager sur Twitter
                              20 mars 2006 à 11:45:53

                              Hum...
                              Vous confirmez qu'avec juste le flip en plus la fenêtre est toujours rafraîchie ?
                              J'ai un sérieux doute, mais si vous me l'assurez je changerai le tuto en conséquence.
                              • Partager sur Facebook
                              • Partager sur Twitter

                              If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                                20 mars 2006 à 12:12:33

                                Le double buffering (activé avec SDL_DOUBLEBUF pour SDL_SetVideoMode()) nécessite l'appel de SDL_Flip(SDL_GetVideoSurface()) à la fin de l'affichage. Cette fonction est bloquante, et ne rend la main qu'une fois l'écran dessiné.
                                Vu que tu n'as pas spécifié SDL_DOUBLEBUF, tu ne devrais pas avoir à l'utiliser...
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  20 mars 2006 à 14:13:22

                                  Sauf que la doc spécifie que le double buffering n'est pas utilisé, ça revient à faire un updaterect général de l'écran.
                                  Maintenant bon je crois pas que le fait que la fonction soit bloquante soit un problème.
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                                    20 mars 2006 à 14:40:47

                                    Citation : M@teo21

                                    Sauf que la doc spécifie que le double buffering n'est pas utilisé, ça revient à faire un updaterect général de l'écran.



                                    Je confirme ! :D

                                    Et pour le code de Antartika, chez moi ca fais bien un dégradé !
                                    Sauf que c'est du transparent vers le blanc o_O
                                    C'est toujours mieux ;)
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      20 mars 2006 à 14:50:19

                                      J'étais, il est vrai, en double buffering, mais même en me mettant en simple buffering, ça ne marche pas sans le SDL_Flip...
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        20 mars 2006 à 15:11:52

                                        Et je voudrais rajouter que à chaque fois que regarde un code source je voie toujours :

                                        atexit(SDL_Quit);

                                        aprés
                                          /* Initialisation de la librairie */
                                          if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
                                                fprintf(stderr,
                                                                "Erreur SDL: %s\n", SDL_GetError());
                                                exit(1);
                                          }

                                        Afin de quitter proprement ( comme ils disent ).
                                        Je voulais savoir si c'est important, à faire ?
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 mars 2006 à 15:33:20

                                          Citation : zedtux

                                          Et je voudrais rajouter que à chaque fois que regarde un code source je voie toujours :

                                          atexit(SDL_Quit);


                                          aprés

                                            /* Initialisation de la librairie */
                                            if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
                                                  fprintf(stderr,
                                                                  "Erreur SDL: %s\n", SDL_GetError());
                                                  exit(1);
                                            }


                                          Afin de quitter proprement ( comme ils disent ).
                                          Je voulais savoir si c'est important, à faire ?


                                          Oui, si on a des exit() dans le code. Sinon, si on a une sortie unique par le return de main(), c'est pas utile. Il suffit de placer SDL_Quit() avant le return.

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

                                          int main(int argc, char *argv[])
                                          {
                                             int ret = EXIT_SUCCESS;

                                             if (SDL_Init (SDL_INIT_VIDEO) >= 0)
                                             {
                                             }
                                             else
                                             {
                                                fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError());
                                                ret = EXIT_FAILURE;
                                             }

                                             SDL_Quit();
                                             return ret ;
                                          }


                                          atexit() permet d'installer une fonction qui est appelée à chaque exit() ou à la sortie normale du main().
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Music only !
                                            20 mars 2006 à 15:38:49

                                            personnellement j'ai eu un probleme de rafraichisement lorsque je voulais faire plusieur dégradé. Mais en fait, c'est tout simplement le SDL_Flip(); ;)

                                            Il suffit d'activer le double buffer et voila :)
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              20 mars 2006 à 15:56:12

                                              Ok ed, merci ^^

                                              Moi je reteste le cours de mateo, pour simplement afficher une fenetre, qui apparait avec un fond noir chez lui. Moi c'est transparant.

                                              Et quand je prend le code pour afficher le fond vert, pareil transparant. Donc suite a notre discution, dans la boucle while de pause(); je rajoute SDL_Flip(ecran);

                                              J'ai bien une fenêtre verte .... mais transparente !!! o_O

                                              Image utilisateur
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                20 mars 2006 à 16:30:14

                                                T'aurais pas bidouillé du côté des valeurs alpha des couleurs ?...
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  20 mars 2006 à 17:27:25

                                                  Ben non, j'ai juste fais un copier/coller du cours de Mateo, et ajouté SDL_Flip(ecran); dans la boucle while de la fonction pause();
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    20 mars 2006 à 18:06:35

                                                    Oui mais ton thème gère la transparence...
                                                    Ça viens surement de là.
                                                    Essaye avec un autre thème ;)
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      20 mars 2006 à 18:10:42

                                                      Ah oui ta console est transparente.
                                                      Donc sous linux, confirmez tous que vous mettez un sdl_flip dans la fonction pause et je modifierai le tuto alors :)
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      If you'd like to join us, read "How do we work at OpenClassrooms"! :)

                                                        20 mars 2006 à 19:33:52

                                                        Je confirme.
                                                        Pour voir la surface "ecran" du code-exemple tiré du cours, j'ai du rajouter un SDL_Flip(ecran). (après l'avoir "coloré" bien sur)
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          20 mars 2006 à 20:01:33

                                                          Lol, ca me rassure de voir que je ne suis pas le seul à avoir un joli rectangle noir avec la SDL ^^ . Et je confirme, avec SDL_Flip, ca marche impec lol. Et Mateo, je te rassure, ce n'est pas ta fonction pause qui est en cause. J'ai essayé le code sans utiliser cette fonction, en utilisant un SDL_Delay(), et ça me faisait un beau carré tout noir alors que j'attendais un carré vert expldr!!! Donc, voila, j'ai bien fait de venir sur le forum dis donc ^^ . J'ai eu la réponse à ma question
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            20 mars 2006 à 22:10:28

                                                            Oui, ça vient de ton Thème gnome !
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              20 mars 2006 à 23:23:04

                                                              Heu... J'ai un doute...

                                                              Tout les autres programmes n'ont aucun soucis ...

                                                              Et la, la transparence, c'est pas un thème ! C'est une option de la console...

                                                              Et ca veut dire, que si un mec mettais un thème spéciale, je programme ou jeux apparaitrait transparent ??? o_0

                                                              Maintenant je ne vais pas remettre en doute ce que vous dites, et je vais essayer.

                                                              Et C'est un thème ^^ c'est Xgl+Compiz ;)


                                                              EDIT : Arf ... Diable ! :diable:
                                                              C'est bien Compiz qui pose problèmes ! o_O
                                                              Aprés l'avoir tué, j'ai bien le bon affichage dans ma fenêtre.

                                                              Mais alors, pourquoi est ce que le code plus haut pour afficher le carré vert fonctionne lui et n'est pas transparent ? :o
                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              [SDL & LINUX]La fenetre n'affiche rien

                                                              × 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