-
Notifications
You must be signed in to change notification settings - Fork 6
/
rotozoom.c
75 lines (57 loc) · 2.04 KB
/
rotozoom.c
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
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_rotozoom.h>
#include <SDL/SDL_image.h>
#define TEMPS 30 // Le temps qu'il y a entre chaque augmentation de l'angle.
int main(int argc, char *argv[])
{
SDL_Surface *ecran = NULL, *image = NULL, *rotation = NULL;
SDL_Rect rect;
SDL_Event event;
double angle = 0;
double zoom = 1;
int sens = 1;
int continuer = 1;
int tempsPrecedent = 0, tempsActuel = 0;
SDL_Init(SDL_INIT_VIDEO);
ecran = SDL_SetVideoMode(500, 500, 32, SDL_HWSURFACE);
SDL_WM_SetCaption("Faire des rotations avec SDL_gfx", NULL);
image = IMG_Load("sdl.jpg");
while(continuer)
{
SDL_PollEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
}
tempsActuel = SDL_GetTicks();
if (tempsActuel - tempsPrecedent > TEMPS)
{
angle += 2; //On augmente l'angle pour que l'image tourne sur elle-même.
tempsPrecedent = tempsActuel;
}
else
{
SDL_Delay(TEMPS - (tempsActuel - tempsPrecedent));
}
SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
rotation = rotozoomSurface(image, angle, zoom, 0); //On transforme la surface image.
//On repositionne l'image en fonction de sa taille.
rect.x = event.button.x - rotation->w / 2;
rect.y = event.button.y - rotation->h / 2;
SDL_BlitSurface(rotation , NULL, ecran, &rect); //On affiche la rotation de la surface image.
SDL_FreeSurface(rotation); //On efface la surface rotation car on va la redéfinir dans la prochaine boucle. Si on ne le fait pas, cela crée une fuite de mémoire.
if(zoom >= 2){sens = 0;}
else if(zoom <= 0.5){sens = 1;}
if(sens == 0){zoom -= 0.02;}
else{zoom += 0.02;}
SDL_Flip(ecran);
}
SDL_FreeSurface(ecran);
SDL_FreeSurface(image);
SDL_Quit();
return EXIT_SUCCESS;
}