Bonjour,
Je suis en train de programmer en SDL le jeu de serpent et j'ai un problème pour le faire grandir. J'utilise le timer pour assurer le déplacement du serpent. Maintenant je n'arrive pas a faire manger le serpent ni a le faire grandir .... voici le code que j'ai écris si vous pouvez me répondre dans les plus brèves délai je vous serais reconnaissant
#include <stdio.h>
#include <stdlib.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <time.h>
#define N 500
#define LARGEUR 800
#define LONGUEUR 600
SDL_Surface *ecran = NULL;
SDL_Surface *snake[N] = {NULL};
SDL_Surface *fruit = NULL;
SDL_Surface *mur = NULL ;
SDL_Surface *mur1 = NULL;
SDL_Surface *mur2 = NULL;
SDL_Surface *mur3 = NULL;
SDL_Surface *blank = NULL;
SDL_Event event;
typedef enum {up,down,right,left}Direction;
SDL_Rect snakepos[N];
SDL_Rect fruitpos;
SDL_Rect pos_mur;
SDL_Rect pos_mur1;
SDL_Rect pos_mur2;
SDL_Rect pos_mur3;
int init;
int continuer = 1;
int i;
int noeuds;
int vitesse;
int pause = 1;
SDL_TimerID timer;
Direction direction;
Uint32 gestion_snake(Uint32 intervalle , void *param);
Uint32 gestion_fruit(Uint32 intervalle,void *param);
void deplacer_serpent(void);
void position_serpent(void);
void blit_surface(void);
void montrer_serpent(void);
void montrer_fruit(void);
void position_fruit(void);
int main(){
init = SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO|SDL_INIT_TIMER);
noeuds = 10;
vitesse = 50;
direction = right;
if (init == -1){
printf("Erreur de chargement");
SDL_Quit();
}
ecran = SDL_SetVideoMode(LARGEUR,LONGUEUR,32,SDL_HWSURFACE|SDL_DOUBLEBUF);
SDL_FillRect(ecran,NULL,SDL_MapRGB(ecran->format,0,0,0));
if(ecran == NULL){
printf("Erreur lors de l'allocation de la mémoire");
exit(0);
}
snakepos[0].x = ecran->w/2;
snakepos[0].y = ecran->h/2;
fruitpos.x = ecran->w/2;
fruitpos.y = ecran->h/3;
fruit = SDL_CreateRGBSurface(SDL_HWSURFACE,10,10,32,0,255,255,255);
SDL_FillRect(fruit,NULL,SDL_MapRGB(fruit->format,255,255,255));
snake[0] = SDL_CreateRGBSurface(SDL_HWSURFACE,10,10,32,0,100,100,100);
SDL_FillRect(snake[0],NULL,SDL_MapRGB(snake[0]->format,101,100,100));
for(i = 1;i<noeuds;i++){
snake[i] = SDL_CreateRGBSurface(SDL_HWSURFACE,10,10,32,0,100,100,100);
SDL_FillRect (snake[i], NULL, SDL_MapRGB (snake[i]->format, 101, 101, 100));
snakepos[i].x = snakepos[i-1].x - LARGEUR;
snakepos[i].y = ecran->h/2;
}
if(snakepos[0].x == fruitpos.x && snakepos[0].y == fruitpos.y){
noeuds = noeuds+1;
for(i = 0;i<noeuds;i++){
snake[i] = SDL_CreateRGBSurface(SDL_HWSURFACE,10,10,32,0,100,100,100);
SDL_FillRect (snake[i], NULL, SDL_MapRGB (snake[i]->format, 101, 101, 100));
snakepos[i].x = snakepos[i-1].x - LARGEUR;
snakepos[i].y = ecran->h/2;
}
}
montrer_fruit();
montrer_serpent();
SDL_Flip(ecran);
timer = SDL_AddTimer(1,gestion_snake,&vitesse);
while(continuer){
SDL_WaitEvent(&event);
switch(event.type)
{
case SDL_QUIT:
continuer = 0;
break;
case SDL_KEYDOWN:
if (event.key.keysym.sym == SDLK_ESCAPE && pause == 1){
SDL_RemoveTimer(timer);
pause = 0;
break;
}
if (event.key.keysym.sym == SDLK_ESCAPE && pause == 0){
deplacer_serpent();
position_serpent();
montrer_serpent();
pause = 1;
break;}
switch(event.key.keysym.sym){
case SDLK_UP:
direction = up;
break;
case SDLK_DOWN:
direction = down;
break;
case SDLK_LEFT:
direction = left;
break;
case SDLK_RIGHT:
direction = right;
break;
}
}
}
SDL_FreeSurface(mur);
SDL_FreeSurface(mur1);
SDL_FreeSurface(mur2);
SDL_FreeSurface(mur3);
SDL_FreeSurface(ecran);
SDL_FreeSurface(fruit);
for(i = 0;i<noeuds;i++)
SDL_FreeSurface(snake[i]);
SDL_Quit();
return 0;
}
void deplacer_serpent(void){
switch(direction){
case up:
if(snakepos[0].y>0)
snakepos[0].y = snakepos[0].y-10;
else SDL_RemoveTimer(timer);
break;
case right:
if(snakepos[0].x<LARGEUR)
snakepos[0].x = snakepos[0].x+10;
else SDL_RemoveTimer(timer);
break;
case left:
if(snakepos[0].x>0)
snakepos[0].x = snakepos[0].x-10;
else SDL_RemoveTimer(timer);
break;
case down:
if(snakepos[0].y<LONGUEUR)
snakepos[0].y = snakepos[0].y+10;
else
SDL_RemoveTimer(timer);
break;
}
}
void montrer_serpent(void){
int i;
for (i=0; i<noeuds; i++)
SDL_BlitSurface (snake[i], NULL, ecran, &snakepos[i]);
}
void montrer_fruit(void){
SDL_BlitSurface(fruit,NULL,ecran,&fruitpos);
}
void position_serpent(void){
int i;
for (i=(noeuds-1); i>0; i--){
snakepos[i].x = snakepos[i-1].x;
snakepos[i].y = snakepos[i-1].y;
}
}
void position_fruit(void){
fruitpos.x = fruitpos.x;
fruitpos.y = fruitpos.y;
}
void blit_surface(void){
SDL_Rect p;
p.x = 0;
p.y = 0;
blank = SDL_CreateRGBSurface(SDL_HWSURFACE, ecran->w, ecran->h, 32, 0, 0, 0, 0);
SDL_FillRect (blank, NULL, SDL_MapRGB (blank->format, 0,0,0));
SDL_BlitSurface (blank, NULL, ecran, &p);
SDL_FreeSurface (blank);
}
Uint32 gestion_snake(Uint32 intervalle,void *param){
Uint32 *t = (Uint32*)param;
SDL_Delay (*t);
deplacer_serpent();
position_fruit();
position_serpent();
blit_surface();
montrer_fruit();
montrer_serpent();
SDL_Flip(ecran);
return intervalle;
}
Afficher la suite