Dépendances (dans l'archive) :
homer.bmp
#include <sdl/sdl.h> #pragma comment(lib,"sdl.lib") #pragma comment(lib,"sdlmain.lib") SDL_Surface* Charger(const char* fic) { SDL_Surface* res = SDL_LoadBMP(fic); if (res==NULL) { printf("Erreur chargement %s\n",fic); exit(-1); } return res; } int KeyHit() { SDL_Event e; if (SDL_PollEvent(&e)) if (e.type == SDL_KEYDOWN) return 1; return 0; } void Blit(SDL_Surface* source,SDL_Surface* dest,int x,int y) { SDL_Rect R; R.x = x; R.y = y; SDL_BlitSurface(source,NULL,dest,&R); } int main(int argc,char** argv) { SDL_Surface* homer,*screen; SDL_Rect R,copy; SDL_Init(SDL_INIT_VIDEO); screen=SDL_SetVideoMode(800,600,32,SDL_SWSURFACE|SDL_DOUBLEBUF); homer=Charger("homer.bmp"); SDL_SetColorKey(homer,SDL_SRCCOLORKEY ,SDL_MapRGBA(homer->format,255,0,255,0)); R.x = 500; R.y = 100; while(!KeyHit()) { SDL_FillRect(screen,NULL,0); R.x--; SDL_BlitSurface(homer,NULL,screen,&R); SDL_Flip(screen); SDL_Delay(1); } R.x = 500; while(!KeyHit()) { SDL_FillRect(screen,NULL,0); R.x--; copy = R; SDL_BlitSurface(homer,NULL,screen,©); SDL_Flip(screen); SDL_Delay(1); } R.x = 500; while(!KeyHit()) { SDL_FillRect(screen,NULL,0); R.x--; Blit(homer,screen,R.x,R.y); SDL_Flip(screen); SDL_Delay(1); } SDL_FreeSurface(homer); SDL_Quit(); return 0; }
SDL pose quelques soucis pour blitter à des coordonnées négatives. Voici le soucis : Je charger Homer dans le main. Puis je prépare un SDL_Rect R, coordonnées 500,100 1er while : *********** je décrémente R.x (coordonnnée du sprite) et je blit. Problème : il s'arrête à gauche... Pourquoi ? -> Parce que quand on donne un SDL_Rect avec des coordonnées négatives, il le modifie et les remet à 0. C'est ainsi. Il blit bien à une coordonnée négative, mais après, il remet à 0. (Cela est dû au fait qu'en interne, il va découper la partie à afficher, donc joue avec les x,y du rect de sortie) Dans notre cas, Il va blitter à 0, puis faire R.x--, donc va blitter à -1, puis remettre à 0, puis faire R.x--, puis blitter à -1, puis remettre à 0, etc.... Donc à chaque frame, on blit à -1 : le sprite ne bouge plus... Appuyez sur une touche pour quitter le while : On remet R.x = 500 2eme while : ************ Cette fois ci, je modifie R, mais je le copie dans un autre SDL_Rect appelé "copy", et c'est lui que je passe à SDL_BlitSurface. Il va le remettre à 0, mais on s'en fout : c'est une copie : R est intact, et continuera à se décrémenter dans les valeurs négatives. Vérifiez : le sprite sort bien à gauche :) On a gagné ! Appuyez sur une touche pour quitter le while : On remet R.x = 500 3eme while : ************ La même chose que le deuxième, mais j'ai enfermé le recopiage dans une fonction. Ma fonction Blit prend un x,y, qu'elle ne modifiera pas, et blit correctement. Le sprite sort bien à gauche :)