URL: https://linuxfr.org/forums/programmation-c--2/posts/snake-en-sdl Title: Snake en SDL Authors: lmg Date: 2009年06月25日T20:45:11+02:00 Tags: Score: 0 Bonjour à tous, Pourriez vous me donner vos avis et conseils sur le code suivant? C'est le début d'un snake en SDL. Et de plus deux petites questions: -Tout d'abord concernant l'affichage d'une image lors de la collision, le programme plante. -Ensuite sur le fait que si j'execute le binaire compilé par codeblocks en dehors de cet IDE, il me sort une belle erreur de segmentation. Voila voila, place au code source. Désolé pour le manque de commentaires, je me ferais un plaisir de commenter toute partie difficilement compréhensible. (j'ai du rajouter des espaces sur les inclusions) #include < stdio.h> #include < stdlib.h> #include < DL.h> #include "main.h" #include < string.h> #define TAILLEMAX 2000 enum {BAS, DROITE, HAUT, GAUCHE}; int main(int argc, char* argv[]) { £spaces£ £/spaces£SDL_Surface *ecran, *serpent, *boum, *tete[4]; £spaces£ £/spaces£char titre[20] = "Snake"; £spaces£ £/spaces£demarreSdl(&ecran, titre); £spaces£ £/spaces£initialise(ecran, &serpent, &boum, tete); £spaces£ £/spaces£evenements(ecran, serpent, boum, tete); £spaces£ £/spaces£fermeSdl(serpent, boum); £spaces£ £/spaces£return 0; } void demarreSdl(SDL_Surface **ecran, char titre[]) { £spaces£ £/spaces£if(SDL_Init(SDL_INIT_VIDEO) == -1) £spaces£ £/spaces£{ £spaces£ £/spaces£fprintf(stderr, "Erreur d'initialisation de la SDL : %s\n", SDL_GetError()); // Ecriture de l'erreur £spaces£ £/spaces£exit(EXIT_FAILURE); // On quitte le programme £spaces£ £/spaces£} £spaces£ £/spaces£SDL_WM_SetIcon(SDL_LoadBMP("ico.bmp"), NULL); £spaces£ £/spaces£*ecran = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_RESIZABLE | SDL_DOUBLEBUF); £spaces£ £/spaces£if(*ecran == NULL) £spaces£ £/spaces£{ £spaces£ £/spaces£fprintf(stderr, "Impossible de charger le mode vidéo: %s\n", SDL_GetError()); £spaces£ £/spaces£} £spaces£ £/spaces£SDL_WM_SetCaption(titre, NULL); £spaces£ £/spaces£SDL_EnableKeyRepeat(1, 1); } void fermeSdl(SDL_Surface *serpent, SDL_Surface *boum) { £spaces£ £/spaces£SDL_FreeSurface(serpent); £spaces£ £/spaces£SDL_FreeSurface(boum); £spaces£ £/spaces£SDL_Quit(); } void evenements(SDL_Surface *ecran, SDL_Surface *serpent, SDL_Surface *boum, SDL_Surface *tete[]) { £spaces£ £/spaces£int continuer =1, direction=BAS, taille=5, i=0; £spaces£ £/spaces£SDL_Event evenement; £spaces£ £/spaces£SDL_Rect positionSerpent[TAILLEMAX]; £spaces£ £/spaces£initialiseSerpent(positionSerpent, serpent, ecran, taille); £spaces£ £/spaces£i=100; £spaces£ £/spaces£while (continuer) £spaces£ £/spaces£{ £spaces£ £/spaces£SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 2, 100, 40)); £spaces£ £/spaces£blitteSerpent(serpent, ecran, positionSerpent, taille, direction, tete); £spaces£ £/spaces£SDL_Flip(ecran); £spaces£ £/spaces£if(i==100) £spaces£ £/spaces£{ £spaces£ £/spaces£decalePositions(positionSerpent, taille); £spaces£ £/spaces£avanceSerpent(serpent, positionSerpent, direction); £spaces£ £/spaces£i=0; £spaces£ £/spaces£} £spaces£ £/spaces£else £spaces£ £/spaces£{ £spaces£ £/spaces£i++; £spaces£ £/spaces£} £spaces£ £/spaces£if(SDL_PollEvent(&evenement)) £spaces£ £/spaces£{ £spaces£ £/spaces£switch(evenement.type) £spaces£ £/spaces£{ £spaces£ £/spaces£case SDL_KEYDOWN: £spaces£ £/spaces£switch(evenement.key.keysym.sym) £spaces£ £/spaces£{ £spaces£ £/spaces£case SDLK_RIGHT: £spaces£ £/spaces£if(direction != GAUCHE) £spaces£ £/spaces£direction = DROITE; £spaces£ £/spaces£break; £spaces£ £/spaces£case SDLK_LEFT: £spaces£ £/spaces£if(direction != DROITE) £spaces£ £/spaces£direction = GAUCHE; £spaces£ £/spaces£break; £spaces£ £/spaces£case SDLK_UP: £spaces£ £/spaces£if(direction != BAS) £spaces£ £/spaces£direction = HAUT; £spaces£ £/spaces£break; £spaces£ £/spaces£case SDLK_DOWN: £spaces£ £/spaces£if(direction != HAUT) £spaces£ £/spaces£direction = BAS; £spaces£ £/spaces£break; £spaces£ £/spaces£case SDLK_PLUS: £spaces£ £/spaces£case SDLK_p: £spaces£ £/spaces£if(taille0) £spaces£ £/spaces£taille--; £spaces£ £/spaces£break; £spaces£ £/spaces£case SDLK_ESCAPE: £spaces£ £/spaces£continuer = 0; £spaces£ £/spaces£break; £spaces£ £/spaces£default: £spaces£ £/spaces£break; £spaces£ £/spaces£} £spaces£ £/spaces£break; £spaces£ £/spaces£case SDL_QUIT: £spaces£ £/spaces£continuer =0; £spaces£ £/spaces£break; £spaces£ £/spaces£default: break; £spaces£ £/spaces£} £spaces£ £/spaces£} £spaces£ £/spaces£if(cogne(positionSerpent, ecran, taille)) £spaces£ £/spaces£{ £spaces£ £/spaces£perdu(boum, ecran, positionSerpent); £spaces£ £/spaces£continuer =0; £spaces£ £/spaces£} £spaces£ £/spaces£} } void initialise(SDL_Surface *ecran, SDL_Surface **serpent, SDL_Surface **boum, SDL_Surface *tete[]) { £spaces£ £/spaces£int i=0; £spaces£ £/spaces£char nom[10]; £spaces£ £/spaces£SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 2, 100, 40)); £spaces£ £/spaces£*serpent = SDL_LoadBMP("serpent.bmp"); £spaces£ £/spaces£*boum = SDL_LoadBMP("boum.bmp"); £spaces£ £/spaces£for(i=0; i<4; i++) £spaces£ £/spaces£{ £spaces£ £/spaces£sprintf(nom, "tete%d.bmp", i); £spaces£ £/spaces£tete[i]= SDL_LoadBMP(nom); £spaces£ £/spaces£} } void initialiseSerpent(SDL_Rect positionSerpent[], SDL_Surface *serpent, SDL_Surface *ecran, int taille) { £spaces£ £/spaces£int i=0; £spaces£ £/spaces£for(i=0; iw)/2)-((serpent->w)/2); £spaces£ £/spaces£positionSerpent[i].y = ((ecran->h/2)-(serpent->h/2)); £spaces£ £/spaces£} } void blitteSerpent(SDL_Surface *serpent, SDL_Surface *ecran, SDL_Rect positionSerpent[], int taille, int direction, SDL_Surface *tete[]) { £spaces£ £/spaces£int i; £spaces£ £/spaces£SDL_Rect positionTete; £spaces£ £/spaces£positionTete.x = positionSerpent[0].x; £spaces£ £/spaces£positionTete.y = positionSerpent[0].y; £spaces£ £/spaces£switch(direction) £spaces£ £/spaces£{ £spaces£ £/spaces£case BAS: £spaces£ £/spaces£positionTete.x = positionSerpent[0].x+tete[0]->w-serpent->w; £spaces£ £/spaces£SDL_BlitSurface(tete[0], NULL, ecran, &positionTete); £spaces£ £/spaces£break; £spaces£ £/spaces£case DROITE: £spaces£ £/spaces£positionTete.y = positionSerpent[0].y+tete[1]->h-serpent->h; £spaces£ £/spaces£SDL_BlitSurface(tete[1], NULL, ecran, &positionTete); £spaces£ £/spaces£break; £spaces£ £/spaces£case HAUT: £spaces£ £/spaces£positionTete.y = positionSerpent[0].y-tete[2]->h+serpent->h; £spaces£ £/spaces£SDL_BlitSurface(tete[2], NULL, ecran, &positionTete); £spaces£ £/spaces£break; £spaces£ £/spaces£case GAUCHE: £spaces£ £/spaces£positionTete.x = positionSerpent[0].x-tete[3]->w+serpent->w; £spaces£ £/spaces£SDL_BlitSurface(tete[3], NULL, ecran, &positionTete); £spaces£ £/spaces£break; £spaces£ £/spaces£} £spaces£ £/spaces£for(i=1; ih+1; £spaces£ £/spaces£break; £spaces£ £/spaces£case DROITE: £spaces£ £/spaces£positionSerpent[0].x+=serpent->w+1; £spaces£ £/spaces£break; £spaces£ £/spaces£case HAUT: £spaces£ £/spaces£positionSerpent[0].y-=serpent->h+1; £spaces£ £/spaces£break; £spaces£ £/spaces£case GAUCHE: £spaces£ £/spaces£positionSerpent[0].x-=serpent->w+1; £spaces£ £/spaces£break; £spaces£ £/spaces£} } int cogne(SDL_Rect positionSerpent[], SDL_Surface *ecran, int taille) { £spaces£ £/spaces£if(positionSerpent[0].x <0 || positionSerpent[0].x>= ecran->w || positionSerpent[0].y<0 || positionSerpent[0].y>= ecran->h) £spaces£ £/spaces£{ £spaces£ £/spaces£return 1; £spaces£ £/spaces£} £spaces£ £/spaces£else if(surSerpent(positionSerpent, taille)) £spaces£ £/spaces£{ £spaces£ £/spaces£return 1; £spaces£ £/spaces£} £spaces£ £/spaces£else £spaces£ £/spaces£{ £spaces£ £/spaces£return 0; £spaces£ £/spaces£} } int surSerpent(SDL_Rect positionSerpent[], int taille) { £spaces£ £/spaces£int resultat=0, i; £spaces£ £/spaces£for(i=1; iw/2-boum->w/2; £spaces£ £/spaces£position.y=ecran->h/2-boum->h/2; £spaces£ £/spaces£printf("%d, %d:%d", SDL_BlitSurface(boum, NULL, ecran, &position), position.x, position.y); }

AltStyle によって変換されたページ (->オリジナル) /