Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL]Print

    11 mars 2006 à 17:18:10

    Bon je sais j'anticipe un peu sur le tuto de Matéo ^^

    J'ai consulté de nombreux tutos sur la SDL, et dans la plupart le premier exercice est donné par le code suivant:



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

    int main( int argc‚ char *argv[ ] )
    {
        SDL_Surface *screen;
        if( SDL_Init( SDL_INIT_VIDEO ) == –1 )
        {
            printf( "Can't init SDL:  %s\n"‚ SDL_GetError( ) );
            exit( 1 );
        }

        atexit( SDL_Quit );
        screen = SDL_SetVideoMode( 64048016‚ SDL_HWSURFACE );

        if( screen == NULL )
        {
            printf( "Can't set video mode: %s\n"‚ SDL_GetError( ) );
            exit( 1 );
        }   
           
         printf("SDL ouvert^^\n");
        SDL_Delay( 3000 );

        return 0;
    }



    Seulement voila, chez moi la fonction printf ne donne rien.C'est à dire que j'ai bien une fenêtre SDL qui s'ouvre, mais pas l'affichage de texte dans la console.
    Peut être est-ce dû à un probléme de configuration du programme :/
    • Partager sur Facebook
    • Partager sur Twitter
      11 mars 2006 à 17:22:17

      Regarde dans le dossier de ton projet, normalement tu devrais avoir un fichier stdout, mais tu auras ce fichier seulement si l'initialisation a rencontré un problème (à part pour le dernier printf()).
      • Partager sur Facebook
      • Partager sur Twitter
        11 mars 2006 à 17:23:25

        On ne peux pas ecrire avec printf dans la fenêtre avec SDL, il faut utiliser la librairie SDL_ttf
        Là, tu viens d'écrire SDL dans le fichier stdout

        Amicalement Mercosuh
        • Partager sur Facebook
        • Partager sur Twitter
          11 mars 2006 à 17:30:24

          Ok d'accord j'avais pas compris que ça écrivait dans un fichier txt.
          Bon tant que j'y suis, au sujet de la transparence ^^:
          Je vois pas la différence qu'il peut y avoir entre
          SDL_SetColorKey et SDL_setAlpha
          • Partager sur Facebook
          • Partager sur Twitter
            11 mars 2006 à 17:35:17

            SDL_SetColorKey -> rend transparent une couleur
            SDL_setAlpha -> rend plus ou moins transparent une surface
            • Partager sur Facebook
            • Partager sur Twitter
              11 mars 2006 à 17:38:46

              Arf ok merci.
              Et comment faire pour dialoguer avec l'utilisateur si je n'ai pas la console?
              il me faut la librairie SDL_ttf?
              • Partager sur Facebook
              • Partager sur Twitter
                11 mars 2006 à 18:56:45

                tu peux aussi utilisé un .h qui comprend des fonction basiques.


                /***********************************************
                 ****************** FONT 1.6 *******************
                 ***********************************************
                 ***** Fonction simple d'écriture avec SDL *****
                 ***********************************************
                 ******* Par Rémi RAMPIN‚ alias remram44 *******
                 ************* www.remram44.fr.st **************
                 *********** remi.rampin@laposte.net ***********
                 ***********************************************/


                /*
                Font_Init() doit être appelée après SDL_Init()

                Font_SetFont(const char * file‚int w‚int h [‚int r‚int g‚int b]) prend en paramètre :
                    – file      : l'adresse de la bitmap de la font à utiliser
                    – w et h    : la taille d'un caractère dans cette bitmap
                    – r‚ g et b : la couleur de fond de la bitmap de la fonte (si non spécifié‚ la couleur de fond sera 0)

                Retourne 0 si réussi.

                Font_Quit() doit être appelé avant SDL_Quit()

                Font_Text(int x‚int y‚SDL_Surface * surf‚const char * texte) prend plusieurs paramètres :
                    – x et y : position où le texte sera affiché (en pixel depuis le coin en haut à gauche
                               de l'écran)
                    – surf   : surface SDL où le texte sera écrit
                    – texte  : texte à afficher. Soit entre guillemets‚ soit un pointeur sur un tableau de char
                               (le dernier char doit être '\0').

                Font_Char(int x‚int y‚SDL_Surface * surf‚char carac) sert à afficher un caractère au lieu d'une
                chaîne

                Font_Number(int x‚int y‚SDL_Surface * sruf‚int nb) sert à afficher un nombre à l'écran au lieu
                d'un caractère

                */


                #ifndef _FONT_INCLUDED
                #define _FONT_INCLUDED

                SDL_Surface * Font_Surface;
                int Font_W‚Font_H‚Font_R‚Font_G‚Font_B;

                // Initialisation
                int Font_Init()
                {
                    Font_Surface=NULL;

                    Font_W=0;
                    Font_H=0;

                    Font_R=0;
                    Font_G=0;
                    Font_B=0;

                    return 0;
                }

                // Initialisation
                int Font_SetFont(const char* file‚int w‚int h‚int r‚int g‚int b)
                {
                    if(Font_Surface!=NULL)
                    {
                        SDL_FreeSurface(Font_Surface);
                        Font_Surface=NULL;
                    }
                    Font_Surface=SDL_LoadBMP(file);
                    if(Font_Surface==NULL)
                        return1;

                    // Taille d'un carac
                    Font_W=w;
                    Font_H=h;

                    // Couleur du fond
                    Font_R=r;
                    Font_G=g;
                    Font_B=b;
                    return 0;
                }

                // Quitter
                void Font_Quit()
                {
                    SDL_FreeSurface(Font_Surface);
                }

                /*// Pour récupérer le code ASCII d'un caractère
                int Font_GetNum(char carac)
                {
                    int i=(int)carac;
                    if(i<0) { i+=256; }
                    return i;
                }*/


                // Pour écrire un caractère
                void Font_Char(int x‚int y‚SDL_Surface * surf‚char carac)
                {
                    SDL_Rect dest = {x‚y‚Font_W‚Font_H};
                    SDL_Rect src  = {00‚Font_W‚Font_H};
                    int num=(int)((unsigned char)carac)// Code ASCII du caractère à afficher
                    int col=num/16;                       // On récupère la ligne du caractère à afficher
                    src.y=col*Font_H;                     // Chaque ligne fait h pixels de hauteur
                    num–=col*16;                          // On enlève les caractères qu'on a sauté (16 par ligne)
                    src.x=num*Font_W;                     // On récupère la colonne du caractère à afficher

                    // Colorkey pour affichage transparent
                    SDL_SetColorKey(Font_Surface‚SDL_SRCCOLORKEY‚SDL_MapRGB(Font_Surface–>format‚Font_R‚Font_G‚Font_B));

                    // Blit
                    SDL_BlitSurface(Font_Surface‚&src‚surf‚&dest);
                }

                // Pour écrire une chaîne
                void Font_Text(int x‚int y‚SDL_Surface * surf‚const char * texte)
                {
                    int dep=x;
                    const char * pos=texte;
                    while(*pos!='\0')
                    {
                        if(*pos=='\n')
                        {
                            y+=Font_H;
                            x=dep;
                            pos+=1;
                        }
                        else
                        {
                            Font_Char(x‚y‚surf‚*pos);
                            x+=Font_W;
                            pos+=1;
                        }
                    }
                }

                // Pour écrire un nombre
                // nécessite <stdio.h>
                void Font_Number(int x‚int y‚SDL_Surface* surf‚int nb)
                {
                    char texte[100];
                    sprintf(texte‚"%d"‚nb);
                    Font_Text(x‚y‚surf‚texte);
                }

                #endif

                /*

                // Exemple d'utilisation :

                    // Initialisation de Font
                    Font_Init();

                    // On charge une fonte
                    Font_SetFont("carac.bmp"‚8‚16);

                    // On écrit simplement du texte à l'écran
                    Font_Text(20‚100‚sScreen‚"Bonjour ! Tous les caractères ASCII peuvent être utilisés !");

                    // On écrit un caractère
                    Font_Char(200‚200‚sScreen‚'c');

                    // On écrit un nombre
                    Font_Number(200‚232‚sScreen‚2005);

                    // On quitte Font
                    Font_Quit();

                */



                exemple d'une fonte a charger : Image utilisateur

                J'ai jamais utilisé SDL_ttf, donc je peut pas de dire quoi prendre, juste qu'un .h est plus simple a "installé".^^
                • Partager sur Facebook
                • Partager sur Twitter
                  11 mars 2006 à 19:46:29

                  tiens, le code de remram ^^ .
                  Deja : du code dans un header c'est moche.
                  Aussi : SDL_Ttf est extrêmet simple d'utilisation, et elle fait des choses étonnantes !
                  • Partager sur Facebook
                  • Partager sur Twitter
                    12 mars 2006 à 9:44:28

                    Oui mais je veux dire, pour entrer des boutons et des boites de dialogues , va falloir que j'apprenne le C++, SDL ne peut pas faire ça toute seule.si ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      12 mars 2006 à 10:06:40

                      Bah si, mais si tu veux des vrais boutons et des vraies boites de dialogue, tu peux utiliser des librairies basées sur GTK, ou une librairie de Widgets.
                      Pour ça, pas besoin du tout de C++, tu peux utiliser des librairies C comme GTK.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        12 mars 2006 à 12:09:59

                        Bon ok j'y penserai merci.
                        Tant qu'on y est j'ai un probléme pour passer des surfaces à une fonction.
                        un code du genre

                        int main()
                        {
                         //sdl ini etc ...
                         SDL_Surface *ecran;
                          ecran_ini(ecran);
                         
                          SDL_Flip(ecran);
                          SDL_Delay(3000);
                        }

                        int ecran_ini(SDL_Surface *ecran)
                        {
                         ecran = SDL_SetVideoMode(6404808‚SDL_SWSURFACE);
                         //plus quelques autre bidouillages qui fonctionnent sans problème

                        }


                        Ca compile, ferme direct et j'ai un message dans stderr.txt ("segmentation fault")..
                        Apparemment, el bug vient du fait que j'ai placé 'sdl_flip' dans le main et non dans la fonction d'initialisaiton de l'écran.
                        Je comprend pas troop pourquoi le fait de passer le pointeur ecran à la fonction fait que le sdl_flip plante ...
                        • Partager sur Facebook
                        • Partager sur Twitter
                          12 mars 2006 à 13:09:02


                          int ecran_ini(SDL_Surface *ecran)
                          {
                           ecran = SDL_SetVideoMode(6404808‚SDL_SWSURFACE);
                           //plus quelques autre bidouillages qui fonctionnent sans problème

                          }


                          Comme ta fonction reçoit un pointeur, ecran == l'adresse de la surface, *ecran == la surface.

                          Donc :


                          int ecran_ini(SDL_Surface *ecran)
                          {
                           *ecran = SDL_SetVideoMode(6404808‚SDL_SWSURFACE);
                           //plus quelques autre bidouillages qui fonctionnent sans problème

                          }

                          marchera mieux ;).

                          ++
                          • Partager sur Facebook
                          • Partager sur Twitter
                            12 mars 2006 à 15:19:00

                            Non, quand tu utilises la SDL tu ne manipules jamais des SDL_Surface mais des SDL_Surface*, il faut que tu passes l'adresse du pointeur vers ta surface car tu la modifies :
                            int ecran_ini(SDL_Surface **ecran)
                            {
                             *ecran = SDL_SetVideoMode(6404808‚SDL_SWSURFACE);
                             //plus quelques autre bidouillages qui fonctionnent sans problème

                            }

                            ou bien tu la retournes comme tu le souhaites
                            • Partager sur Facebook
                            • Partager sur Twitter
                              12 mars 2006 à 17:16:26

                              Je vois je vois ^^.
                              Bon et au sujet des évenements maintenant :-°, on n'est bien d'accord que MOUSEBUTTONDOWN c'est quand je presse un bouton de la souris, et MOUSeBUTTONUP c'est quand l'un des boutons est relaché..Paske pour mon application il semble que mousebuttonup c'est quand je presse la roulette de la souris -_-
                              • Partager sur Facebook
                              • Partager sur Twitter
                                12 mars 2006 à 17:20:28

                                Mousebouttonup et down, c'est quand un bouton est appuyé ou relaché. Après, pour savoir c'est lequel, event.button.button, 1 = bouton gauche, 2 = roulette, 3 = bouton droit.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  12 mars 2006 à 17:26:49

                                  Bah c'est bien ce que j'avais compris alors.

                                  Mais chez moi ça donne :down pour boutonn appuyé, up pour roulette : /
                                  Le plus curieu étant que ça marchait dans un code précédent
                                  -.-...Je pige pas du tout ...

                                  a tout hasard je donne l'extrait de code

                                  while(!fin)
                                  {
                                   SDL_GetMouseState(&mousex‚&mousey);
                                   
                                   switch(SDL_PollEvent(&event))
                                   {
                                    case SDL_MOUSEBUTTONUP:
                                     print("up");
                                     break;

                                    case SDL_MOUSEBUTTONDOWN:
                                     print("down");
                                     break;
                                   }
                                  }
                                  • Partager sur Facebook
                                  • Partager sur Twitter

                                  [SDL]Print

                                  × 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