Dépendances (dans l'archive) :
font.bmp
#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; }
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