Bonjour à tous;
Après avoir fait quelques jeux basiques en SDL, je me suis lancé dans le codage de petits détailles qui donnent vraiment du peps au jeu .
Ainsi je me suis mis à bosser sur l'animation des sprites.
Pour simplifier les testes et les explications, nous allons gérer que une seule direction avec un minimum d'image, ( 3 frames) .
Nous avons donc une plaquette de 3 sprites, dont la frame 0 représente le personnage bougeant la jambe gauche, la frame 1 le personnage immobile et la frame 3 le personnage bougeant la jambe droite.
Dès que le joueur appuie sur la flèche du mouvement, on prend le temps à ce moment précis dans timeX. On change de frame et on bouge l'image du personnage seulement si timeX-timeY > 200, pour rentrer dans le cycle de l'animation on fait prendre à la variable timeX, la valeur de timeY (je sais pas si vous me suivez ).
Voila donc le code que j'ai pondu:
Celui-ci marche, le personnage, dès que j'appuie sur la flèche du bas, se déplace en étant animer vers le bas automatiquement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <stdlib.h> #include <stdio.h> #include <SDL/SDL.h> #include <SDL_image.h> #include "main.h" int main(int argc, char *argv[]) { SDL_Surface *ecran = NULL, *hero = NULL; long j; SDL_Rect clip[1][3], position; long frame = 1; long timex = 0, timey = 0; long orientation = BAS, animation = 0; for(j=0;j<3;j++) { clip[0][j].x = j*32; clip[0][j].y = 0; clip[0][j].w = 32; clip[0][j].h = 32; } SDL_Event event; long continuer = 1; SDL_Init(SDL_INIT_VIDEO); ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); SDL_WM_SetCaption("Gestion des animations en SDL", NULL); hero = IMG_Load("hero_cygne.png"); position.x = 300; position.y = 0; while(continuer) { SDL_PollEvent(&event); switch(event.type) { case SDL_QUIT: continuer = 0; case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_DOWN: orientation = BAS; animation = 1; timex = SDL_GetTicks(); } break; } SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); if(animation) { timey = SDL_GetTicks(); if(timey-timex > 200) { frame = (frame+1)%3; deplacer_joueur(&position, orientation); timex = timey; timey = 0; } } SDL_BlitSurface(hero, &clip[0][frame], ecran, &position); SDL_Flip(ecran); } SDL_FreeSurface(hero); SDL_Quit(); return EXIT_SUCCESS; } void deplacer_joueur(SDL_Rect *position_hero, long orientation) { if(orientation == BAS) { position_hero->y+=2; } }
J'ai voulu le modifier pour que le personnage puisse être complètement contrôlable, c'est à dire, dès que j'appuie sur la flèche du bas, il doit se déplacer vers le bas en étant animer, puis dès que je relache la touche, il ne doit plus bouger et revenir à la position frame = 1.
Voila mon code modifié:
Mais ce dernier code ne marche pas, en effet, rien ne se fait quand je presse la flèche du bas, le personnage ne bouge même plus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 #include <stdlib.h> #include <stdio.h> #include <SDL/SDL.h> #include <SDL_image.h> #include "main.h" int main(int argc, char *argv[]) { SDL_Surface *ecran = NULL, *hero = NULL; long j; SDL_Rect clip[1][3], position; long frame = 1; long timex = 0, timey = 0; long orientation = BAS, animation = 0; for(j=0;j<3;j++) { clip[0][j].x = j*32; clip[0][j].y = 0; clip[0][j].w = 32; clip[0][j].h = 32; } SDL_Event event; long continuer = 1; SDL_Init(SDL_INIT_VIDEO); ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_DOUBLEBUF); SDL_WM_SetCaption("Gestion des animations en SDL", NULL); hero = IMG_Load("hero_cygne.png"); position.x = 300; position.y = 0; while(continuer) { SDL_PollEvent(&event); switch(event.type) { case SDL_QUIT: continuer = 0; case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_DOWN: orientation = BAS; animation = 1; timex = SDL_GetTicks(); } break; case SDL_KEYUP: switch(event.key.keysym.sym) { case SDLK_DOWN: animation = 0; } break; } SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255)); if(animation) { timey = SDL_GetTicks(); if(timey-timex > 200) { frame = (frame+1)%3; deplacer_joueur(&position, orientation); timex = timey; timey = 0; } } else { frame = 1; } SDL_BlitSurface(hero, &clip[0][frame], ecran, &position); SDL_Flip(ecran); } SDL_FreeSurface(hero); SDL_Quit(); return EXIT_SUCCESS; } void deplacer_joueur(SDL_Rect *position_hero, long orientation) { if(orientation == BAS) { position_hero->y+=2; } }
Je n'arrive vraiment pas à régler ce problème avec mon niveau de débutant en programmation , l'erreur doit se trouver dans SDL_KEYUP mais je ne la vois pas...
Merci d'avance pour l'aide.
Partager