printf pour SDL

Un exemple pour refaire comme printf pour SDL.

Voir version :

Dépendances (dans l'archive) :
font.bmp

Télécharger :

#include <stdarg.h>
#include <sdl/sdl.h>

#pragma comment(lib,"sdl.lib")
#pragma comment(lib,"sdlmain.lib")

int WaitKey()
{
    SDL_Event e;
    do
    {
        SDL_WaitEvent(&e);
    } while(e.type!=SDL_KEYDOWN);
    return 0;
}

void PrintSDL(SDL_Surface* font,SDL_Surface* dest,int x,int y,char* text,...)
{ // l'image doit faire 16 * 14 caractères.
    char buf[500];
    int i,len;
    SDL_Rect Rsrc,Rdst;
    va_list args;
    va_start(args,text);
    vsprintf(buf,text,args);
    va_end(args);
    Rsrc.w = font->w/16;
    Rsrc.h = font->h/14;
    len = (int)strlen(buf);
    for(i=0;i<len;i++)
    {
        Rsrc.x = Rsrc.w*((unsigned char)(buf[i])%16);
        Rsrc.y = Rsrc.h*((unsigned char)(buf[i])/16-2);  // on saute les 31 premiers codes ASCII
        Rdst.x = x;
        Rdst.y = y;
        SDL_BlitSurface(font,&Rsrc,dest,&Rdst);
        x+=Rsrc.w;
    }
}

int main(int argc,char** argv)
{
    SDL_Surface *screen,*font;
    SDL_Init(SDL_INIT_VIDEO);
    screen=SDL_SetVideoMode(800,600,32,SDL_SWSURFACE|SDL_DOUBLEBUF);  
    font=SDL_LoadBMP("font.bmp");
    if (!font)
        return -1;
    PrintSDL(font,screen,50,50,"Plouf !");
    PrintSDL(font,screen,20,90,"Vous avez %d ans",30);
    SDL_Flip(screen);
    WaitKey();
    SDL_FreeSurface(font);
    SDL_Quit();
    return 0;
}



Commentaires


Une fonction PrintfSDL qui prend une image bmp avec les lettres placées de manière régulière, et affiche
les chaines voulues tel un printf. Vous pouvez constater que, comme printf, je peux utiliser %d et toutes 
les syntaxes de printf.

Les images comme font.bmp peuvent être générées par le programme ttfcompiler que vous trouverez plus loin
dans cette partie. La fonction PrintSDL est taillée pour.

Cette fonction se contente de blitter les lettres une par une, avec un for. Pour chaque lettre, elle calcule
la position de la lettre à afficher (utilisant la régularité de l'image font.bmp), puis l'affiche.

Cette fonction utilise vsprintf, qui permet de gérer les arguments variables propres à printf.
Il est donc nécessaire d'inclure stdarg.h. Il y a sur mon site un exemple commenté sur stdarg.h