Blit à coordonnées négatives.

Quelques précautions sont à prendre pour blitter sur des coordonnées négatives avec SDL.

SDL_BlitSurface

Voir version :

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

Télécharger :

#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,&copy);
        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;
}



Commentaires

	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 :)