#include #include #include #include #include #include "main.h" int decl=0; /*--Affiche un sprite à l'écran--*/ void blitsprit(Sprite *spr, int anim, int frame, int x,int y) { int i, j, pix, loc = x + y*640; int decal = danslemenu ? 64 : 0; Uint8 *framept; if (spr==NULL || anim>=spr->nanims || frame>=spr->anims[anim]->nframes) return; framept=spr->anims[anim]->frame[frame]; VERROUILLE; for (i=0; i<32; i++) { if (0<=y+i+decal && y+i<480) for (j=0; j<32; j++) { if (0<=x+j+decal && x+j<640 && framept[i*32+j]) { pix=loc+i*640+(j+decal); ((Uint8 *)ecran->pixels)[pix] = framept[i*32+j]; } } } DEVERROUILLE; return; } animation * cree_animation(int nb_frames) { int i; animation *anim; anim = (animation *)malloc(sizeof(animation)); anim->nframes = nb_frames; anim->frame = (Uint8 **)calloc(nb_frames, sizeof *anim->frame); for (i=0; iframe[i] = (Uint8 *)malloc(1024); memset(anim->frame[i], 0, 1024); } return(anim); } Sprite * cree_sprite(int nb_anims, int decal, int nb_coul) { Sprite *spri; spri = (Sprite *)malloc(sizeof(Sprite)); spri->nanims = nb_anims; spri->decalage = decal; spri->anims = (animation **)calloc(nb_anims, sizeof *spri->anims); spri->palette = (SDL_Palette *)malloc(sizeof(SDL_Palette)); spri->palette->colors = (SDL_Color *)calloc(50, sizeof spri->palette->colors); memset(spri->palette->colors, 0, 30*3); spri->palette->ncolors = nb_coul; spri->nom = NULL; return spri; } void detruit_sprite(Sprite *spr) { int i, j; for (i=0; inanims; i++) { for (j=0; janims[i]->nframes; j++) free(spr->anims[i]->frame[j]); free(spr->anims[i]->frame); free(spr->anims[i]); } free(spr->anims); free(spr->palette->colors); free(spr->palette); if (spr->nom) free(spr->nom); free(spr); } void detruit_sprites(void) { int i; for (i=0; inom=strdup(nom); strcpy(strstr(spr->nom, ".spr"),"\0"); spr->nom[0]=toupper(spr->nom[0]); /* D'abord on lit la palette */ if (fread(pal, 3, ncoul, spr_fich)!= ncoul) erreur("La palette du sprite est corrompue", chemin); for (i=0; ipalette->colors[i].r = *(pal+3*i); spr->palette->colors[i].g = *(pal+3*i+1); spr->palette->colors[i].b = *(pal+3*i+2); } free(pal); /* Puis les anims */ for (i=0; ianims[i] = cree_animation(nframes); for (j=0; j255) erreur("Le nombre de couleurs allouées par le programme dépasse la palette", chemin); } else pix = 0; spr->anims[i]->frame[j][k] = pix; } } } free(fr); fclose(spr_fich); SDL_SetColors(ecran, spr->palette->colors, decalage+1, spr->palette->ncolors); decl += spr->palette->ncolors; tous_les_sprites[nsprites]=spr; nsprites++; return spr; } void charge_graphs(FILE *niveau) { char nom[256]; //printf("Chargement des décors..."); if(fscanf(niveau, "sol: %s\n", nom)) sol = charge_sprite(nom, decl); if(fscanf(niveau, "bloc: %s\n", nom)) bloc = charge_sprite(nom, decl); if(fscanf(niveau, "mur: %s\n", nom)) mur = charge_sprite(nom, decl); if(fscanf(niveau, "fleche: %s\n", nom)) fleche = charge_sprite(nom, decl); if(fscanf(niveau, "teleport: %s\n", nom)) teleport = charge_sprite(nom, decl); if(fscanf(niveau, "tunnel: %s\n", nom)) tunnel = charge_sprite(nom, decl); if(fscanf(niveau, "bouton: %s\n", nom)) bouton = charge_sprite(nom, decl); if(fscanf(niveau, "fontaine: %s\n", nom)) fontaine = charge_sprite(nom, decl); bombe = charge_sprite("bombe.spr", decl); flammes = charge_sprite("flammes.spr", decl); bonus = charge_sprite("bonus.spr", decl); etoiles = charge_sprite("etoiles.spr", decl); //printf("OK. %i couleurs allouées.\n", decl); return; } void charge_sprites(Sprite **sprites, char **spritliste, int n) { int i; for (i=0; i