Bonjour à tous ,
je suis entrain de m'amuser à programmer un petit snake histoire de pratiquer,bon il ne fonctionne pas trop mal mais j'ai quelques bugs que je ne comprend pas .
La méthode que j'utilise est la suivante:
j'ai découpe mon snake en 3 parties .
1-la tête qui à une position unique .
2-le corps qui à autant de position différentes que de parties , donc j'utilise un SDL_Rect de type tableau .
3-la queue qui n'a qu'une position également.
lorsque je charge ma carte dans un tableau 2d (à partir d'un fichier texte), je récupéré les positions de départ de toutes les parties du bestiaux (à la manière du sokoban).
Pour ensuite les blitter à l’écran après avoir blitter la carte . toutes les 120 milliseceondes, la boucle refait un tour .
à ce stade le snake ne bouge pas donc . Si j'appuie sur une des flèches (keyup) , j'initialise un booléen à 1 ,ainsi qu'une direction dans laquelle mon snake doit avancer.
ensuite, une fois le booléen à 1 est ma direction choisie, j’appelle une fonction qui va modifier les positions des partie de mon snake toutes les 120 milisec.
J'ai procède de la façon suivante :
1: j'enregistre la position de la tête, puis selon la direction choisi, la tête prend une nouvelle position x et y ,
2: j'enregistre la position[0] du corps ,donc de la partie 1 , et je lui donne la position précédente de la tête .
3: j'enregistre la position[1] du corps (partie2) et lui donne la position précédente de la partie1 .
4: ainsi de suite pour chaque parties .
5 :et enfin je donne a la queue la position que possédait la dernière partie du corps .
Je retourne a ma boucle d’événement et je bitte les images avec leur nouvelles positions .
Je vais mettre la partie du code qui correspond pour que vous y voyez plus clair .
ainsi qu'un lien pour télécharger l'exe .
Les bugs que j'ai sont les suivants :
Au début j'ai un décalage que je ne m'explique pas , ensuite à chaque fois que le snake mange une pomme, sa queue se blitte à un endroit inexpliqué (mais forcement logique) de la carte pour ensuite continuer à coller au bestiaux ... (ce dernier bug est reglé j'ai modifie le code source)
Voila merci d'avance à ceux qui auront le courage de lire le pavé ainsi que le code et surtout à ceux qui voudront bien m'aider à résoudre ce petit bug![]()
voila l'exe http://www.megaupload.com/?d=1M0VQR0C
Partie qui modifie les positions de la bête
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 void modifierPositionsSerpent(SDL_Rect *positionTeteSerpent, SDL_Rect positionCorps[],SDL_Rect *positionQueue,int* partiesCorps, int direction,int carte[][40]) { int teteX=positionTeteSerpent->x;// je sauvegarde la position de la tete int teteY=positionTeteSerpent->y; int i=1,j=0; int corpsX[40]={NULL},corpsY[40]={NULL}; switch(direction) //je modifie la position de la tete selon la direction { case DROITE: positionTeteSerpent->x+=15; break; case GAUCHE: positionTeteSerpent->x-=15; break; case BAS: positionTeteSerpent->y+=15; break; case HAUT: positionTeteSerpent->y-=15; break; } int pommeMange=0; switch(carte[positionTeteSerpent->x/15][positionTeteSerpent->y/15]) { case POMME2: carte[positionTeteSerpent->x/15][positionTeteSerpent->y/15]=VIDE2; *partiesCorps=*partiesCorps+1; pommeMange=1; break; case CARRE_OBSTACLE2: break; } corpsX[0]=positionCorps[0].x;//je sauvegarde la position du corps corpsY[0]=positionCorps[0].y; positionCorps[0].x=teteX;// donne a la premiere partie du corps la position positionCorps[0].y=teteY;// de la tete for(i=1;i<*partiesCorps;i++) { corpsX[i]=positionCorps[i].x,corpsY[i]=positionCorps[i].y; //j'enregistre la position du corps avant de la modifier positionCorps[i].x=corpsX[j], positionCorps[i].y=corpsY[j]; //et je donne a la partie du corps qui suit la position enregistre j++; } if(!pommeMange) { positionQueue->x=corpsX[j]; positionQueue->y=corpsY[j]; } }
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 Boucle principale du jeu <code type="c"> while(continuer) { SDL_PollEvent(&event); switch(event.type) { case SDL_QUIT: continuer = 0; break; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_UP: deplacement=1; direction=HAUT; break; case SDLK_DOWN: deplacement=1; direction=BAS; break; case SDLK_RIGHT: deplacement=1; direction=DROITE; break; case SDLK_LEFT: deplacement=1; direction=GAUCHE; break; } break; } SDL_FillRect(fenetre, NULL, SDL_MapRGB(fenetre->format,255, 255, 255)); map(fenetre,imagesCorps,images,position,carte); tempsActuel = SDL_GetTicks(); if (tempsActuel - tempsPrecedent > 120) { if(deplacement)//ici j apelle la fonction de modification une fois le boleen à 1 modifierPositionsSerpent(&positionTeteSerpent,positionCorps,&positionQueue, &partiesCorps,direction,carte); tempsPrecedent = tempsActuel; } else { SDL_Delay(120 - (tempsActuel - tempsPrecedent)); } // je blitte la tete SDL_BlitSurface(images[TETE], NULL, fenetre,&positionTeteSerpent); // je blitte les differentes parties du corps for(i=0;i<partiesCorps;i++) { SDL_BlitSurface(images[CARRE_OBSTACLE], NULL, fenetre,&positionCorps[i]); } // et enfin le cul SDL_BlitSurface(images[QUEUE], NULL, fenetre,&positionQueue); SDL_Flip(fenetre); }
Partager