Dépendances (dans l'archive) :
fond.bmp
#include <sdl/sdl.h> #pragma comment(lib,"sdl.lib") #pragma comment(lib,"sdlmain.lib") #define SPEED -1 #define IMX 368 #define IMY 388 SDL_Surface* Charger(const char* fic) { SDL_Surface *res; SDL_Surface* tmp = SDL_LoadBMP(fic); if (tmp==NULL) { printf("Erreur chargement %s\n",fic); exit(-1); } res = SDL_DisplayFormat(tmp); SDL_FreeSurface(tmp); return res; } int KeyHit() { SDL_Event e; if (SDL_PollEvent(&e)) if (e.type == SDL_KEYDOWN) return 1; return 0; } int negatmodulo(int x,int mod) { if (x>=0) return x%mod; return (x%mod)+mod; } int main(int argc,char** argv) { SDL_Surface* fond,*screen; int x = 0; SDL_Init(SDL_INIT_VIDEO); screen=SDL_SetVideoMode(IMX,IMY,32,SDL_SWSURFACE|SDL_DOUBLEBUF); fond=Charger("fond.bmp"); while(!KeyHit()) { SDL_Rect R; R.x = negatmodulo(x,IMX); R.y = 0; SDL_BlitSurface(fond,NULL,screen,&R); R.x = negatmodulo(x,IMX) - IMX; SDL_BlitSurface(fond,NULL,screen,&R); x+=SPEED; SDL_Flip(screen); SDL_Delay(3); } SDL_FreeSurface(fond); SDL_Quit(); return 0; }
Un petit exemple pour montrer un scrolling simple. Un scrolling est un défilement d'écran. Lancez le programme, vous voyez le fond défiler. Notez que, comme fond, j'ai pris une image ou la partie droite coïncide avec la partie gauche : c'est à dire que si vous collez 2 images cote à cote, vous ne voyez pas les jointures. Quelques petites explications. Le main : --------- Je définis une variable x qui sera la coordonnée de fenêtrage, c'est à dire que si on imagine un monde géant, c'est la coordonnée x de ma fenêtre. En faisant incrémenter ou décrémenter x, je défile. Je vais afficher deux images côte à cote, dépendant de x, ou plûtot du modulo de X par la largeur de X IMX. Au lieu d'utiliser directement le modulo, j'utilise une fonction. Car contrairement à l'opérateur %, je veux une valeur entre 0 et IMX-1 et ce même si x est négatif, alros que le modulo natif va me donner une valeur entre -IMX+1 .. IMX-1 Je blit les deux images côte à côte. Inutile de découper moi même les images (la partie visible), la fonction SDL_BlitSurface s'en charge automatiquement. Le SDL_Delay permet de ralentir un peu le rythme : comme la fenêtre est petite, si je ne fais pas ça, ça va trop vite. Essayez donc :)