Bonjour à tous mon problème est simple, j'ai suivi le tutorial de loka sur les mouvements, et j'adapte cela dans mon jeu. Néanmoins j'ai des problèmes lors du déplacement :
- J'aimerai que lorsque que le joueur maintient par exemple la touche gauche et puis appuie sur la touche droite (tout en tenant la touche gauche), le joueur tourne à droite. En gros que ce soit la dernière touche qui entre en compte au niveau de gauche et droite
En gros, dans l'état actuel des choses, le joueur va bien à gauche et à droite, mais plusieurs fois si on a pas un bon timing l'animation se fige, et le personnage s'arrête d'un coup. De plus lorsque que l'on presse les deux touches, l'animation se joue mais le joueur n'avance pas (je pense que c'est parce que le booléen marche = true mais que les vitesse s'annulent donc pas d'avancement....mais une animation)
C'est assez casse-tête et je m'en remets à vous si vous avez une solution...
voici un peu de mon code :
La gestion des évenements :
La gestion de la vitesse et l'affichage :
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 void Hero::Events(SDL_Event event) { //Si une touche est préssée if( event.type == SDL_KEYDOWN ) { //Mise à jour if (event.key.keysym.sym == SDLK_RIGHT) //droite { marche = true; frameBegin = 2; frameCourante = frameBegin; frameLimitEtat = frameBegin + 7; vitesseX += 10; } else if (event.key.keysym.sym == SDLK_LEFT) // gauche { marche = true; frameBegin = 9; frameCourante = frameBegin; frameLimitEtat = frameBegin + 7; vitesseX -= 10; } } //Si une touche est relachée else if( event.type == SDL_KEYUP ) { if (event.key.keysym.sym == SDLK_RIGHT) //droite { marche = false; frameCourante = 0; vitesseX -= 10; } if (event.key.keysym.sym == SDLK_LEFT) //gauche { marche = false; frameCourante = 1; vitesseX += 10; } } }
Voilà n'hésitez surtout pas à répondre, c'est assez urgent ^^
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 void Hero::ApplyForces(SDL_Surface *ecran) { //Bouge le point à gauche ou à droite posx += vitesseX; //Si le point se rapproche trop des limites(gauche ou droite) de l'ecran if( ( posx+10 < 0 ) || ( posx-10 > LWINDOW ) ) { //On revient posx -= vitesseX; } posHeros.x = posx; posCurseur.x = posHeros.x; Draw(ecran); } void Hero::Draw(SDL_Surface *ecran) { frameDecompose += tempsAnim; if(marche == true) { if(frameCourante < frameLimitEtat-1) { if (frameDecompose > 1 ) { frameCourante++; frameDecompose = 0; } } else { frameCourante = frameBegin; frameDecompose = 0; } } SDL_BlitSurface(spriteHeros[frameCourante], 0, ecran, &posHeros); SDL_BlitSurface(curseur, 0, ecran, &posCurseur); }
Merci d'avance pour vos réponses constructives !
Partager