1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
#include <SDL.h>
#include <SDL_rotozoom.h>
#include <iostream>
const int WIDTH=640;
const int HEIGHT=480;
int main(int argc, char **argv)
{
//Déclaration des variables
SDL_Event event;
SDL_Surface *screen, *image, *newsurf=NULL;
int done = 0,w,h;
Uint32 screen_noir;
SDL_Rect rect = {200,200,0,0};
double angle = 0.0;
//Initialisation de SDL
if(SDL_Init(SDL_INIT_VIDEO)!=0)
{
std::cerr << "Probleme pour initialiser SDL" << SDL_GetError() << std::endl;
return 1;
}
//Mettre un titre à la fenêtre
SDL_WM_SetCaption("Rotations!!!!", NULL);
//Ouvrerture d'une surface pour l'affichage de la fenêtre
screen = SDL_SetVideoMode(WIDTH,HEIGHT, 32,
SDL_DOUBLEBUF | SDL_HWSURFACE);
//Chargement d'une jolie image
image = SDL_LoadBMP("test.bmp");
SDL_SetColorKey(image,SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(image->format,255,0,255));
if((screen==NULL)||(image==NULL))
done = 1;
//Couleur noire de l'ecran
screen_noir = SDL_MapRGB(screen->format,0,0,0);
//Boucle generale
while(!done)
{
//Traiter les évènements
while(SDL_PollEvent(&event))
{
switch(event.type)
{
//Si on veut quitter, done=1 suffira
case SDL_QUIT:
done=1;
break;
//Si on vient de relacher une touche de clavier
case SDL_KEYUP:
//Et si c'est la lettre q
/*
Attention, ceci ne fonctionne pas avec tous les Systèmes d'exploitation et tous les claviers
Pour le rendre portable, il faudrait passer par les Unicodes, mais cela sort du cadre de ce tutoriel
d'introduction.
Si vous voulez utiliser la lettre 'q' pour quitter et ceci ne fonctionne pas, alors c'est la lettre
'a' qu'il faudra utiliser (c'est la place de la lettre 'q' sur le clavier QWERTY).
Si vous voulez vraiment la lettre 'q', remplacer SDLK_q par SDLK_a, cela devrait faire l'affaire
*/
if(event.key.keysym.sym==SDLK_q)
//On met done a 1 pour quitter
done=1;
break;
//Sinon on ne fait rien
default:
break;
}
}
//On detruit l'ancienne rotation
SDL_FreeSurface(newsurf);
//On cree la nouvelle surface
newsurf = rotozoomSurface(image, angle, 1.0, 1);
if(newsurf==NULL)
{
done = 1;
}
else
{
//Puisque la taille va changer, on veut garder le centre de l'image au meme endroit...
rotozoomSurfaceSize(image->w,image->h,angle,1.0,&w,&h);
rect.x = WIDTH/2 - w/2;
rect.y = HEIGHT/2 - h/2;
angle += 1;
if(angle>360.0)
angle=0.0;
//On remplit de noir
SDL_FillRect(screen,NULL,screen_noir);
//On copie l'image
SDL_BlitSurface(newsurf,NULL,screen,&rect);
//On flip
SDL_Flip(screen);
}
}
SDL_FreeSurface(screen);
SDL_FreeSurface(image);
SDL_FreeSurface(newsurf);
SDL_Quit();
return 0;
} |
Partager