diff --git a/effets.c b/effets.c index 095fc3a2dca6b355642cae323c5709dafbafb463..423c3e7c5a10cf4030736ac8a985af4e8ce7dbc2 100644 --- a/effets.c +++ b/effets.c @@ -3,6 +3,10 @@ Effet nouvel_effet_bloodHit(SDL_Texture **sprites, SDL_Rect pos, int angle){ Effet e; e.pos = pos; + e.pos.x -= 8; + e.pos.y -= 8; + e.pos.w = 60; + e.pos.h = 60; e.srcrect.x = 0; e.srcrect.y = 0; e.srcrect.w = 128; @@ -19,8 +23,8 @@ Effet nouvel_effet_bloodSplatter(SDL_Texture **sprites, SDL_Rect pos, int angle) e.pos = pos; e.pos.x -= 20; e.pos.y -= 20; - e.pos.w = 70; - e.pos.h = 70; + e.pos.w = 80; + e.pos.h = 80; e.srcrect.x = 0; e.srcrect.y = 0; e.srcrect.w = 100; diff --git a/image.c b/image.c index 2ccb88556f72fe87b3326882d79f17ce1f833848..b2a16619bb7a94ba90e9176617cfd04c51dc34e9 100644 --- a/image.c +++ b/image.c @@ -17,7 +17,6 @@ void afficher_niveau(char *tab, SDL_Renderer *renderer, SDL_Texture **spriteMap, SDL_Rect destrect; int tabVal; - //affichage routes & murs for(int j = 0; j < 60; j++){ for(int i = 0; i < 60; i++){ destrect.x = i * 50 - xCamera; @@ -94,14 +93,13 @@ void afficher_niveau(char *tab, SDL_Renderer *renderer, SDL_Texture **spriteMap, } } - //voitures for(int j = 0; j < 60; j++){ for(int i = 0; i < 60; i++){ destrect.x = i * 50 - xCamera; destrect.y = j * 50 - yCamera; destrect.h = 50; destrect.w = 50; - switch(tab[60*j+i]){ + switch(tab[60*j+i]){ case 'P': destrect.w = 200; destrect.h = 100; @@ -122,14 +120,49 @@ void afficher_niveau(char *tab, SDL_Renderer *renderer, SDL_Texture **spriteMap, destrect.h = 300; SDL_RenderCopy(renderer, spriteMap[19], NULL, &destrect); break; - default : break; - } + } } } + return; +} +void charger_images(SDL_Texture **sprites, SDL_Texture **spritesMap, SDL_Renderer *ecran){ + spritesMap[0] = charger_image("sprites/map/sol.png", ecran, 0, 0, -1); + spritesMap[1] = charger_image("sprites/map/mur_h.png", ecran, 255, 255, 255); + spritesMap[2] = charger_image("sprites/map/mur_b.png", ecran, 255, 255, 255); + spritesMap[3] = charger_image("sprites/map/mur_g.png", ecran, 255, 255, 255); + spritesMap[4] = charger_image("sprites/map/mur_d.png", ecran, 255, 255, 255); + spritesMap[5] = charger_image("sprites/map/mur_hg.png", ecran, 255, 255, 255); + spritesMap[6] = charger_image("sprites/map/mur_hd.png", ecran, 255, 255, 255); + spritesMap[7] = charger_image("sprites/map/mur_bg.png", ecran, 255, 255, 255); + spritesMap[8] = charger_image("sprites/map/mur_bd.png", ecran, 255, 255, 255); + spritesMap[9] = charger_image("sprites/map/route_ver.png", ecran, 0, 0, -1); + spritesMap[10] = charger_image("sprites/map/route_hor.png", ecran, 0, 0, -1); + spritesMap[11] = charger_image("sprites/map/police_car.png", ecran, 0, 0, -1); + spritesMap[12] = charger_image("sprites/map/ambulance.png", ecran, 0, 0, -1); + spritesMap[13] = charger_image("sprites/map/eau.png", ecran, 0, 0, -1); + spritesMap[14] = charger_image("sprites/map/conteneurs.png", ecran, 0, 0, -1); + spritesMap[15] = charger_image("sprites/map/maison2.png", ecran, 0, 0, -1); + spritesMap[16] = charger_image("sprites/map/maison.png", ecran, 0, 0, -1); + spritesMap[17] = charger_image("sprites/map/herbe.png", ecran, 0, 0, -1); + spritesMap[18] = charger_image("sprites/map/maison3.png", ecran, 0, 0, -1); + spritesMap[19] = charger_image("sprites/map/fontaine.png", ecran, 0, 0, -1); - - return; + sprites[0] = charger_image("sprites/perso/survivor_handgun.png", ecran, 255, 255, 255); + sprites[1] = charger_image("sprites/ennemis/zombie/move/ennemi1_move.png", ecran, 0, 0, -1); + sprites[2] = charger_image("sprites/ennemis/zombie/attack/ennemi1_attack.png", ecran, 0, 0, -1); + sprites[3] = charger_image("sprites/effets/blood/blood_hitv3.png", ecran, 0, 0, -1); + sprites[4] = charger_image("sprites/effets/blood/blood_splatter.png", ecran, 255, 255, 255); + sprites[5] = charger_image("sprites/perso/survivor_shotgun.png", ecran, 255, 255, 255); + sprites[6] = charger_image("sprites/perso/survivor_rifle.png", ecran, 255, 255, 255); + sprites[7] = charger_image("sprites/projectiles/balle/balle_handgun.png", ecran, 255, 255, 255); + sprites[8] = charger_image("sprites/projectiles/balle/balle_shotgun.png", ecran, 255, 255, 255); + sprites[9] = charger_image("sprites/projectiles/balle/balle_rifle.png", ecran, 255, 255, 255); + sprites[10] = charger_image("sprites/perso/survivor_shotgun.png", ecran, 255, 255, 255); + sprites[11] = charger_image("sprites/perso/survivor_rifle.png", ecran, 255, 255, 255); + sprites[12] = charger_image("sprites/ennemis/zombie/move/ennemi2_move.png", ecran, 0, 0, -1); + sprites[13] = charger_image("sprites/ennemis/zombie/attack/ennemi2_attack.png", ecran, 0, 0, -1); + sprites[14] = charger_image("sprites/projectiles/slime.png", ecran, 0, 0, -1); } diff --git a/image.h b/image.h index 10b9a03303f1e7abd001c0b6d2505293bcdc8e01..4d6bb07f11f8bdc2d1f597d7c337dced589e7588 100644 --- a/image.h +++ b/image.h @@ -3,3 +3,4 @@ SDL_Texture* charger_image(const char* fichier, SDL_Renderer* renderer, int r, int g, int b); void afficher_niveau(char *tab, SDL_Renderer *renderer, SDL_Texture **spriteMap, int xCamera, int yCamera); +void charger_images(SDL_Texture **sprites, SDL_Texture **spritesMap, SDL_Renderer *ecran); diff --git a/listeB.c b/listeB.c index 6ab6eef1eae2a0c139c556302e55ab8a9f901a06..3491f76ca4f96bfc1b906b69921ab2c5effdac81 100644 --- a/listeB.c +++ b/listeB.c @@ -15,51 +15,61 @@ bool est_vide_listeB(ListeB L) { -ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int v, int xCamera, int yCamera, int *nbTues, SDL_Texture **sprites) +ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int v, int xCamera, int yCamera, int dxCamera, int dyCamera, int *nbTues, SDL_Texture **sprites, Perso *joueur) { if(LB == NULL){ return LB; } - incrementer_balle(&LB->data, v); - SDL_Rect ballePos; ballePos.w = 1; ballePos.h = 1; - if(LB->data.angle >= -45 && LB->data.angle < 45){ - ballePos.x = LB->data.ballePos.x + 50; - ballePos.y = LB->data.ballePos.y + 15; - } else if(LB->data.angle >= 45 && LB->data.angle < 135){ - ballePos.x = LB->data.ballePos.x + 30; - ballePos.y = LB->data.ballePos.y + 30; - } else if(LB->data.angle >= -135 && LB->data.angle < -45){ - ballePos.x = LB->data.ballePos.x + 35; - ballePos.y = LB->data.ballePos.y; - } else { - ballePos.x = LB->data.ballePos.x + 15; - ballePos.y = LB->data.ballePos.y; - } - if(ballePos.x < 0 || ballePos.x >= 1000 || ballePos.y <= 0 || ballePos.y >= 700 - || detecter_collision_murs(LR, ballePos, xCamera, yCamera)){ - LB = LB->next; - return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, nbTues, sprites); - } + if(LB->data.ennemi == false){ + incrementer_balle(&LB->data, v, dxCamera, dyCamera); + if(LB->data.angle >= -45 && LB->data.angle < 45){ + ballePos.x = LB->data.ballePos.x + 50; + ballePos.y = LB->data.ballePos.y + 15; + } else if(LB->data.angle >= 45 && LB->data.angle < 135){ + ballePos.x = LB->data.ballePos.x + 30; + ballePos.y = LB->data.ballePos.y + 30; + } else if(LB->data.angle >= -135 && LB->data.angle < -45){ + ballePos.x = LB->data.ballePos.x + 35; + ballePos.y = LB->data.ballePos.y; + } else { + ballePos.x = LB->data.ballePos.x + 15; + ballePos.y = LB->data.ballePos.y; + } - ballePos.w = 2; - ballePos.h = 2; - ballePos.x = LB->data.ballePos.x; - ballePos.y = LB->data.ballePos.y; + if(ballePos.x < 0 || ballePos.x >= 1000 || ballePos.y <= 0 || ballePos.y >= 700 + || detecter_collision_murs(LR, ballePos, xCamera, yCamera)){ + LB = LB->next; + return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur); + } - if(detecter_collision_perso(LP, LE, ballePos, LB->data.angle, LB->data.degats, xCamera, yCamera, nbTues, sprites)) { - LB = LB->next; - return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, nbTues, sprites); + ballePos.w = 2; + ballePos.h = 2; + ballePos.x = LB->data.ballePos.x; + ballePos.y = LB->data.ballePos.y; + + if(detecter_collision_perso(LP, LE, ballePos, LB->data.angle, LB->data.degats, xCamera, yCamera, nbTues, sprites)) { + LB = LB->next; + return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur); + } + } else { + incrementer_balle(&LB->data, 4, dxCamera, dyCamera); + if(detecter_collision_murs(LR, LB->data.ballePos, xCamera, yCamera)){ + LB = LB->next; + return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur); + } + if(detecter_collision_balle_avec_joueur(LB->data.ballePos, LB->data.degats, joueur)){ + LB = LB->next; + return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur); + } } - LB->next = incrementer_balles(LB->next, LP, LR, LE, v, xCamera, yCamera, nbTues, sprites); + LB->next = incrementer_balles(LB->next, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur); return LB; - - return NULL; } void afficher_listeB(SDL_Renderer *renderer, ListeB L) { @@ -70,11 +80,12 @@ void afficher_listeB(SDL_Renderer *renderer, ListeB L) { } } -ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, int v, int xCamera, int yCamera, int *nbTues, SDL_Texture **sprites, Mix_Chunk **sons){ +ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, int v, int xCamera, int yCamera, int dxCamera, int dyCamera, int *nbTues, SDL_Texture **sprites, Mix_Chunk **sons, Perso *joueur){ s_ListeP *tmp = LP; while(tmp != NULL){ - if(tmp->data.tir && tmp->data.ennemi == false){ + if(tmp->data.tir){ int arme; + balle b; arme = tmp->data.arme; switch(arme){ case 0: @@ -101,13 +112,146 @@ ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, int v, tmp->data.tempsTirPrecedent = time; } break; + case -10: + b = nouvelle_balle(sprites[14], tmp->data.angle, 10, tmp->data.pos); + b.ennemi = true; + b.ballePos.x += 10; + b.ballePos.y += 10; + b.ballePos.w = 30; + b.ballePos.h = 30; + b.srcrect.w = 250; + b.srcrect.h = 251; + cons_listeB(&LB, b); + tmp->data.arme = 10; + tmp->data.tir = false; + tmp->data.image = sprites[12]; + tmp->data.pos.w = 50; + tmp->data.pos.h = 50; + tmp->data.srcrect.w = 229; + tmp->data.srcrect.h = 259; + tmp->data.srcrect.y = 0; + tmp->data.yMax = 4403; + tmp->data.animFlip = 1; + tmp->data.vitesse = 2; + default: + break; + } + } else { + if(time > tmp->data.tempsTirPrecedent + 3000 && tmp->data.arme == 10){ + if(tmp->data.collision == false && tmp->data.pos.x > 100 && + tmp->data.pos.x < 900 && tmp->data.pos.y > 100 && tmp->data.pos.y < 600){ + tmp->data.tir = true; + tmp->data.arme = 100; + tmp->data.vitesse = 0; + tmp->data.tempsTirPrecedent = time; + } } } tmp = tmp->next; } + LB = incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, dxCamera, dyCamera, nbTues, sprites, joueur); + return LB; +} + +void animer_balles(ListeB LB){ + while(LB != NULL){ + if(LB->data.ennemi){ + LB->data.srcrect.y += LB->data.srcrect.h; + if(LB->data.srcrect.y > 7 * LB->data.srcrect.h){ + LB->data.srcrect.y = 0; + } + } + LB = LB->next; + } + return; +} - LB = incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, nbTues, sprites); +void animer_ennemi_2(ListeB LB, Perso *p, SDL_Texture **sprites){ - return LB; + if(!p->tir){ + p->srcrect.y += p->srcrect.h * p->animFlip; + if((p->srcrect.y >= p->yMax || p->srcrect.y < 0) && !p->tir){ + p->animFlip = -p->animFlip; + p->srcrect.y += p->srcrect.h * p->animFlip; + } + } else { + if(p->arme == 100){ + p->image = sprites[13]; + p->pos.w = 60; + p->pos.h = 60; + p->srcrect.w = 318; + p->srcrect.h = 294; + p->srcrect.y = 0; + p->yMax = 2646; + p->animFlip = 1; + p->arme = 101; + } else if(p->arme == 101){ + p->srcrect.y += p->srcrect.h; + if(p->srcrect.y >= p->yMax){ + p->arme = -10; + } + } + } + + return; +} + +void animer_ennemi_1(Perso *p, Perso *joueur, SDL_Texture **sprites){ + if(p->tir){ + if(p->arme == -1){ + if(p->srcrect.w != 318){ + p->image = sprites[2]; + p->pos.w = 60; + p->pos.h = 60; + p->srcrect.w = 318; + p->srcrect.h = 294; + p->srcrect.y = 0; + p->yMax = 2646; + p->animFlip = 1; + } else { + p->srcrect.y += p->srcrect.h * p->animFlip; + if(p->srcrect.y == p->srcrect.h * 6){ + if(joueur->vie < p->degats){ + joueur->vie = 0; + }else { + joueur->vie -= p->degats; + } + } else if(p->srcrect.y == p->yMax){ + p->image = sprites[1]; + p->pos.w = 50; + p->pos.h = 50; + p->srcrect.w = 229; + p->srcrect.h = 259; + p->srcrect.y = 0; + p->yMax = 4403; + p->animFlip = 1; + p->tir = false; + p->vitesse = 3; + } + } + } + } else { + p->srcrect.y += p->srcrect.h * p->animFlip; + if((p->srcrect.y >= p->yMax || p->srcrect.y < 0) && !p->tir){ + p->animFlip = -p->animFlip; + p->srcrect.y += p->srcrect.h * p->animFlip; + } + } + return; +} + +void animer_persos(ListeP L, ListeB LB, SDL_Texture **sprites, Perso *joueur){ + + while(L != NULL){ + if(L->data.ennemi){ + if(L->data.arme == -1){ + animer_ennemi_1(&L->data, joueur, sprites); + } else { + animer_ennemi_2(LB, &L->data, sprites); + } + } + L = L->next; + } + return; } diff --git a/listeB.h b/listeB.h index a5771570897597a0901d0f8391b1e9ad827b77e1..cc0fa6ea4476558d792d6fa7850c2538c249603d 100644 --- a/listeB.h +++ b/listeB.h @@ -14,8 +14,11 @@ struct s_ListeB void cons_listeB(ListeB *L, balle data); bool est_vide_listeB(ListeB L); -ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int v, int xCamera, int yCamera, int *nbTues, SDL_Texture **sprites); +ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int v, int xCamera, int yCamera, int dxCamera, int dyCamera, int *nbTues, SDL_Texture **sprites, Perso *joueur); void afficher_listeB(SDL_Renderer *renderer, ListeB L); -ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, int v, int xCamera, int yCamera, int *nbTues, SDL_Texture **sprites, Mix_Chunk **sons); - +ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, int v, int xCamera, int yCamera, int dxCamera, int dyCamera, int *nbTues, SDL_Texture **sprites, Mix_Chunk **sons, Perso *joueur); +void animer_balles(ListeB LB); +void animer_ennemi_1(Perso *p, Perso *joueur, SDL_Texture **sprites); +void animer_ennemi_2(ListeB LB, Perso *p, SDL_Texture **sprites); +void animer_persos(ListeP L, ListeB LB, SDL_Texture **sprites, Perso *joueur); diff --git a/listeP.c b/listeP.c index 9811d014456c8749f93d079e43c57c3af1f116dc..eea9df744402c9050441e58fc053c4d30f5791d9 100644 --- a/listeP.c +++ b/listeP.c @@ -142,9 +142,7 @@ bool detecter_collision_perso(ListeP L, ListeE *LE, SDL_Rect rect, int angle, in } void detecter_collision_avec_joueur(Perso *p, Perso *joueur){ - int ax1, ax2, bx1, bx2, ay1, ay2, by1, by2; - ax1 = p->pos.x; ax2 = p->pos.x + p->pos.w ; bx1 = joueur->pos.x + round(0.24 * joueur->pos.w); @@ -163,25 +161,37 @@ void detecter_collision_avec_joueur(Perso *p, Perso *joueur){ } -void animer_persos(ListeP L, SDL_Texture **sprites, Perso *joueur){ - - while(L != NULL){ - if(L->data.ennemi){ - animer_perso(&L->data, joueur, sprites); - } - L = L->next; +void charger_vague_ennemis(SDL_Renderer *renderer, bool *b, int *vaguesEnnemis, int vagueNum, int xCamera, int yCamera, ListeP *LP, ListeR LR,SDL_Texture **sprites){ + if(vaguesEnnemis[vagueNum] > 0){ + cons_listeP(LP, nouvel_ennemi_1(renderer, LR, sprites, xCamera, yCamera)); + int nb = rand()%4 + 1; + if(nb == 1){ + cons_listeP(LP, nouvel_ennemi_2(renderer, LR, sprites, xCamera, yCamera)); + } + vaguesEnnemis[vagueNum] -= 1; + } else { + *b = true; } return; } +bool detecter_collision_balle_avec_joueur(SDL_Rect pos, int degats, Perso *joueur){ + int ax1, ax2, bx1, bx2, ay1, ay2, by1, by2; + ax1 = pos.x; + ax2 = pos.x + pos.w ; + bx1 = joueur->pos.x + round(0.24 * joueur->pos.w); + bx2 = joueur->pos.x + round(0.75 * joueur->pos.w); + ay1 = pos.y; + ay2 = pos.y + pos.h; + by1 = joueur->pos.y; + by2 = joueur->pos.y + joueur->pos.h; -void charger_vague_ennemis(SDL_Renderer *renderer, bool *b, int *vaguesEnnemis, int vagueNum, int xCamera, int yCamera, ListeP *LP, ListeR LR,SDL_Texture **sprites){ - if(vaguesEnnemis[vagueNum] > 0){ - cons_listeP(LP, nouvel_ennemi_1(renderer, LR, sprites, xCamera, yCamera)); - vaguesEnnemis[vagueNum] -= 1; - } else { - *b = true; + if(ax1 < bx2 && ax2 > bx1 && ay1 < by2 && ay2 > by1){ + joueur->vie -= degats; + return true; } - return; + return false; } + + diff --git a/listeP.h b/listeP.h index 24b17b8217a4e12c8bdbbf09f8ddaa45f12ecade..c9bcf8bb610dec99076f48693a3b9958c59a3f80 100644 --- a/listeP.h +++ b/listeP.h @@ -22,6 +22,5 @@ void deplacement_ennemi(Perso *p, ListeR LR, Perso *joueur, int xCamera, int yCa void deplacement_ennemis(ListeP LP, ListeR LR, ListeE *LE, SDL_Texture **sprites, int xCamera, int yCamera, int dxCamera, int dyCamera); bool detecter_collision_perso(ListeP L, ListeE *LE, SDL_Rect rect, int angle, int degats, int xCamera, int yCamera, int *nbTues, SDL_Texture **sprites); void detecter_collision_avec_joueur(Perso *p, Perso *joueur); -void animer_persos(ListeP L, SDL_Texture **sprites, Perso *joueur); void charger_vague_ennemis(SDL_Renderer *renderer, bool *b, int *vaguesEnnemis, int vagueNum,int xCamera, int yCamera, ListeP *LP, ListeR LR, SDL_Texture **sprites); - +bool detecter_collision_balle_avec_joueur(SDL_Rect pos, int degats, Perso *joueur); diff --git a/listeR.c b/listeR.c index 1bba4c355f148529581f6a120a11b14a7cb39f8e..d355ccfb706e5fb28866c71ebbb90108933c8f0b 100644 --- a/listeR.c +++ b/listeR.c @@ -149,14 +149,19 @@ void charger_niveau(char *tab, ListeR *L){ break; case 'L': rect.x = i * 50 + 30; - rect.y = j * 50 + 215; - rect.h = 360; - rect.w = 210; - cons_listeR(L, rect); - rect.x = i * 50 + 205 ; - rect.y = j * 50 + 40; - rect.h = 425; - rect.w = 570; + rect.y = j * 50 + 213; + rect.h = 362; + rect.w = 167; + cons_listeR(L, rect); + rect.x = i * 50 + 200; + rect.y = j * 50 + 463; + rect.h = 94; + rect.w = 47; + cons_listeR(L, rect); + rect.x = i * 50 + 200 ; + rect.y = j * 50 + 44; + rect.h = 417; + rect.w = 574; cons_listeR(L, rect); break; case 'F': diff --git a/main.c b/main.c index 0bca69802305b8d1c6c934c2a24baa81bc0ad029..38f63ddd821085eeb520ec45da4fc88f821d2dd8 100644 --- a/main.c +++ b/main.c @@ -1,7 +1,7 @@ #include "image.h" #include "listeB.h" #include "SDL2/SDL_ttf.h" - +#include <string.h> int main(int argc, char *argv[]) { @@ -10,9 +10,9 @@ int main(int argc, char *argv[]) SDL_Window *fenetre; SDL_Event evenements; SDL_Renderer *ecran; - SDL_Texture *sprites[12], *spritesMap[20]; + SDL_Texture *sprites[15], *spritesMap[20]; float mouseX, mouseY; - int vitesse, vagueNum, nbTues = 0, arme, tempsActuel, tempsPrecedent, tempsActuelTir, tempsActuelVague, tempsPrecedentVague, + int vitesse, vagueNum, nbTues, arme, tempsPrecedent, tempsPrecedentTexte, tempsActuelTir, tempsActuelVague, tempsPrecedentVague, tempsActuelAnim, tempsPrecedentAnim, xCamera, yCamera, dxCamera, dyCamera, vaguesEnnemis[100]; char map[62][60]; ListeB ballesTirees; @@ -22,112 +22,64 @@ int main(int argc, char *argv[]) Perso p, *joueur_ptr; Mix_Music *musique; Mix_Chunk *sons[3]; + TTF_Font *police; + + - //Initialisation SDL - if(SDL_Init(SDL_INIT_EVERYTHING)) - { + if(SDL_Init(SDL_INIT_EVERYTHING)){ printf("Erreur d'initialisation de la SDL %s", SDL_GetError()); SDL_Quit(); return EXIT_FAILURE; } - - if(Mix_OpenAudio(44100, AUDIO_S16, 1, 4096) < 0) - { + if(Mix_OpenAudio(44100, AUDIO_S16, 1, 4096) < 0){ printf("Erreur d'initialisation de la SDL %s", Mix_GetError() ); SDL_Quit(); return EXIT_FAILURE; } - if(TTF_Init() == -1) - { + if(TTF_Init() == -1){ fprintf(stderr, "Erreur d'initialisation de TTF_Init : %s\n", TTF_GetError()); return (EXIT_FAILURE); } - //Cr�ation fen�tre - fenetre = SDL_CreateWindow("gameName", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1000, 700, SDL_WINDOW_RESIZABLE); - if(fenetre == NULL) - { + fenetre = SDL_CreateWindow("Shooter Game", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 1000, 700, SDL_WINDOW_RESIZABLE); + if(fenetre == NULL){ printf("Erreur d'initialisation de la fenetre %s", SDL_GetError()); return EXIT_FAILURE; } - //Cr�ation renderer ecran = SDL_CreateRenderer(fenetre, -1, SDL_RENDERER_ACCELERATED); - //Initialisation texte + charger_images(&sprites[0], &spritesMap[0], ecran); + + musique = NULL; + charger_sons(&musique, &sons[0]); + SDL_Color couleur = {255, 20, 20}; - SDL_Rect postext; - postext.x = 810; - postext.y = 0; - postext.w = 180; - postext.h = 50; SDL_Rect postext2; - postext2.x = 0; + postext2.x = 810; postext2.y = 0; - postext2.w = 150; + postext2.w = 180; postext2.h = 50; + SDL_Rect postext1; + postext1.x = 0; + postext1.y = 0; + postext1.w = 150; + postext1.h = 50; SDL_Rect postext3; - postext3.x = 370; - postext3.y = 350; - postext3.w = 300; - postext3.h = 100; - TTF_Font *police = NULL; - police = TTF_OpenFont("RAVIE.ttf", 100); - if(police == NULL) - return false; + postext3.x = 810; + postext3.y = 50; + postext3.w = 180; + postext3.h = 50; + police = NULL; + police = TTF_OpenFont("police.otf", 100); SDL_Surface *pSurf; SDL_Texture *text; - SDL_Surface *pSurf2; SDL_Texture *text2; - - - - - //Chargement images - //Murs + Sols - spritesMap[0] = charger_image("sprites/map/sol.png", ecran, 0, 0, -1); - spritesMap[1] = charger_image("sprites/map/mur_h.png", ecran, 255, 255, 255); - spritesMap[2] = charger_image("sprites/map/mur_b.png", ecran, 255, 255, 255); - spritesMap[3] = charger_image("sprites/map/mur_g.png", ecran, 255, 255, 255); - spritesMap[4] = charger_image("sprites/map/mur_d.png", ecran, 255, 255, 255); - spritesMap[5] = charger_image("sprites/map/mur_hg.png", ecran, 255, 255, 255); - spritesMap[6] = charger_image("sprites/map/mur_hd.png", ecran, 255, 255, 255); - spritesMap[7] = charger_image("sprites/map/mur_bg.png", ecran, 255, 255, 255); - spritesMap[8] = charger_image("sprites/map/mur_bd.png", ecran, 255, 255, 255); - spritesMap[9] = charger_image("sprites/map/route_ver.png", ecran, 0, 0, -1); - spritesMap[10] = charger_image("sprites/map/route_hor.png", ecran, 0, 0, -1); - spritesMap[11] = charger_image("sprites/map/police_car.png", ecran, 0, 0, -1); - spritesMap[12] = charger_image("sprites/map/ambulance.png", ecran, 0, 0, -1); - spritesMap[13] = charger_image("sprites/map/eau.png", ecran, 0, 0, -1); - spritesMap[14] = charger_image("sprites/map/conteneurs.png", ecran, 0, 0, -1); - spritesMap[15] = charger_image("sprites/map/maison2.png", ecran, 0, 0, -1); - spritesMap[16] = charger_image("sprites/map/maison.png", ecran, 0, 0, -1); - spritesMap[17] = charger_image("sprites/map/herbe.png", ecran, 0, 0, -1); - spritesMap[18] = charger_image("sprites/map/maison3.png", ecran, 0, 0, -1); - spritesMap[19] = charger_image("sprites/map/fontaine.png", ecran, 0, 0, -1); - - //Personnages + Effets - sprites[0] = charger_image("sprites/perso/survivor_handgun.png", ecran, 255, 255, 255); - sprites[1] = charger_image("sprites/ennemis/zombie/move/zombie_moveV2.png", ecran, 0, 0, -1); - sprites[2] = charger_image("sprites/ennemis/zombie/attack/zombie_attack.png", ecran, 0, 0, -1); - sprites[3] = charger_image("sprites/effets/blood/blood_hitv3.png", ecran, 0, 0, -1); - sprites[4] = charger_image("sprites/effets/blood/blood_splatter.png", ecran, 255, 255, 255); - sprites[5] = charger_image("sprites/perso/survivor_shotgun.png", ecran, 255, 255, 255); - sprites[6] = charger_image("sprites/perso/survivor_rifle.png", ecran, 255, 255, 255); - sprites[7] = charger_image("sprites/projectiles/balle/balle_handgun.png", ecran, 255, 255, 255); - sprites[8] = charger_image("sprites/projectiles/balle/balle_shotgun.png", ecran, 255, 255, 255); - sprites[9] = charger_image("sprites/projectiles/balle/balle_rifle.png", ecran, 255, 255, 255); - sprites[10] = charger_image("sprites/perso/survivor_shotgun.png", ecran, 255, 255, 255); - sprites[11] = charger_image("sprites/perso/survivor_rifle.png", ecran, 255, 255, 255); - - //Sons - musique = NULL; - - charger_sons(&musique, &sons[0]); + SDL_Texture *text3; exit = false; @@ -142,9 +94,9 @@ int main(int argc, char *argv[]) vagueNum = 0; nbTues = 0; arme = 0; - tempsActuel = 0; tempsPrecedent = 0; tempsActuelTir = 0; + tempsPrecedentTexte = 0; tempsActuelVague = 0; tempsPrecedentVague = 0; tempsActuelAnim = 0; @@ -154,11 +106,16 @@ int main(int argc, char *argv[]) dxCamera = 0; dyCamera = 0; + mursListe = NULL; ballesTirees = NULL; effetsListe = NULL; persosListe = NULL; joueur_ptr = NULL; + pSurf = NULL; + text = NULL; + text2 = NULL; + text3 = NULL; charger_niveau(map[0], &mursListe); @@ -168,12 +125,9 @@ int main(int argc, char *argv[]) charger_vagues_ennemis(vaguesEnnemis); - //Boucle de jeu while(!gameover) { - tempsActuel = SDL_GetTicks(); - if (tempsActuel > tempsPrecedent + 16) { - //D�tection �v�nements + if (SDL_GetTicks() > tempsPrecedent + 16) { while(SDL_PollEvent(&evenements)) { switch(evenements.type) @@ -252,7 +206,6 @@ int main(int argc, char *argv[]) } - joueur_ptr = joueur(persosListe); if(joueur_ptr != NULL){ if(switchArme){ @@ -267,55 +220,56 @@ int main(int argc, char *argv[]) tempsActuelAnim = SDL_GetTicks(); - if(tempsActuelAnim > tempsPrecedentAnim + 40 ){ - animer_persos(persosListe, sprites, joueur_ptr); + if(tempsActuelAnim > tempsPrecedentAnim + 40){ + animer_balles(ballesTirees); + animer_persos(persosListe, ballesTirees, sprites, joueur_ptr); animer_effets(effetsListe); tempsPrecedentAnim = tempsActuelAnim; } - //D�tection mort joueur if(joueur_ptr->vie <= 0){ - SDL_Surface *pSurf3 = TTF_RenderText_Blended(police, "GameOver", couleur); - SDL_Texture *text3 = SDL_CreateTextureFromSurface(ecran, pSurf3); - SDL_RenderCopy(ecran, text3, NULL, &postext3); gameover = true; } - else{ - char sc[10]; - char score[] = "Score : "; - char pv[10]; - char vie[] = "Vie : "; - sprintf(sc, "%d", nbTues); - strcat(score, sc); - sprintf(pv, "%d", joueur_ptr->vie); - strcat(vie, pv); - pSurf = TTF_RenderText_Blended(police, score, couleur); //// - text = SDL_CreateTextureFromSurface(ecran, pSurf); - pSurf2 = TTF_RenderText_Blended(police, vie, couleur); - text2 = SDL_CreateTextureFromSurface(ecran, pSurf2); + if(SDL_GetTicks() > tempsPrecedentTexte + 500){ + char sc[11]; + char pv[11]; + char ma[11]; + sc[0] = '\0'; + pv[0] = '\0'; + ma[0] = '\0'; + sprintf(sc, "Score : %d", nbTues); + sprintf(pv, "Vie : %d", joueur_ptr->vie); + sprintf(ma, "Manche : %d", vagueNum + 1); + pSurf = TTF_RenderText_Blended(police, sc, couleur); + text = SDL_CreateTextureFromSurface(ecran, pSurf); + SDL_FreeSurface(pSurf); + pSurf = TTF_RenderText_Blended(police, pv, couleur); + text2 = SDL_CreateTextureFromSurface(ecran, pSurf); + SDL_FreeSurface(pSurf); + pSurf = TTF_RenderText_Blended(police, ma, couleur); + text3 = SDL_CreateTextureFromSurface(ecran, pSurf); + SDL_FreeSurface(pSurf); + tempsPrecedentTexte = SDL_GetTicks(); } - //D�placement/angle de tir ennemis deplacement_ennemis(persosListe, mursListe, &effetsListe, sprites, xCamera, yCamera, dxCamera, dyCamera); - //Tir tempsActuelTir = SDL_GetTicks(); - ballesTirees = tir_update(ballesTirees, persosListe, mursListe, &effetsListe, tempsActuelTir, vitesse, xCamera, yCamera, &nbTues, sprites, &sons[0]); - + ballesTirees = tir_update(ballesTirees, persosListe, mursListe, &effetsListe, tempsActuelTir, vitesse, xCamera, yCamera, dxCamera, dyCamera, &nbTues, sprites, &sons[0], joueur_ptr); - //Affichage SDL_RenderClear(ecran); afficher_niveau(map[0], ecran, spritesMap, xCamera, yCamera); afficher_listeE(ecran, effetsListe, dxCamera, dyCamera); afficher_listeP(ecran, persosListe); afficher_listeB(ecran, ballesTirees); - SDL_RenderCopy(ecran, text, NULL, &postext); - SDL_RenderCopy(ecran, text2, NULL, &postext2); + SDL_RenderCopy(ecran, text, NULL, &postext2); + SDL_RenderCopy(ecran, text2, NULL, &postext1); + SDL_RenderCopy(ecran, text3, NULL, &postext3); SDL_RenderPresent(ecran); - tempsPrecedent = tempsActuel; + tempsPrecedent = SDL_GetTicks(); } } @@ -324,7 +278,6 @@ int main(int argc, char *argv[]) } - //Nettoyage SDL_DestroyWindow(fenetre); SDL_DestroyRenderer(ecran); Mix_FreeMusic(musique); diff --git a/personnage.c b/personnage.c index 821a78ce827a593351b1b89a6be51c0c8bf1ec38..ac18e74a9ca624682230e11b7b5f999eca519e10 100644 --- a/personnage.c +++ b/personnage.c @@ -14,7 +14,7 @@ Perso nouveau_joueur(SDL_Renderer *renderer, SDL_Texture **sprites){ p.srcrect.w = 395; p.srcrect.h = 151; p.angle = 0; - p.vie = 20; + p.vie = 100; p.vitesse = 4; p.yMax = 0; p.arme = 0; @@ -60,6 +60,16 @@ Perso nouvel_ennemi_1(SDL_Renderer *renderer, ListeR LR, SDL_Texture **sprites, return p; } +Perso nouvel_ennemi_2(SDL_Renderer *renderer, ListeR LR, SDL_Texture **sprites, int xCamera, int yCamera){ + Perso p; + p = nouvel_ennemi_1(renderer, LR, sprites, xCamera, yCamera); + p.vie = 50; + p.vitesse = 3; + p.image = sprites[12]; + p.arme = 10; + return p; +} + void afficher_perso(SDL_Renderer *renderer, Perso p) { SDL_RenderCopyEx(renderer, p.image, &p.srcrect, &p.pos, p.angle, NULL, SDL_FLIP_NONE); return; @@ -69,7 +79,7 @@ void afficher_perso(SDL_Renderer *renderer, Perso p) { void charger_vagues_ennemis(int *tab){ int n = 1; for(int j = 1; j < 101; j++){ - if(j%5 == 0 ){ + if(j%4 == 0 ){ n += 1; } tab[j-1] = j * n; @@ -153,51 +163,6 @@ void angle_ennemi(Perso *p){ return; } -void animer_perso(Perso *p, Perso *joueur, SDL_Texture **sprites){ - if(p->tir){ - if(p->srcrect.w != 318){ - p->image = sprites[2]; - p->pos.w = 60; - p->pos.h = 60; - p->srcrect.w = 318; - p->srcrect.h = 294; - p->srcrect.y = 0; - p->yMax = 2646; - p->animFlip = 1; - } else { - p->srcrect.y += p->srcrect.h * p->animFlip; - if(p->srcrect.y == p->srcrect.h * 6){ - if(joueur->vie < p->degats){ - joueur->vie = 0; - }else { - joueur->vie -= p->degats; - } - } else if(p->srcrect.y == p->yMax){ - p->image = sprites[1]; - p->pos.w = 50; - p->pos.h = 50; - p->srcrect.w = 229; - p->srcrect.h = 259; - p->srcrect.y = 0; - p->yMax = 4403; - p->animFlip = 1; - p->tir = false; - p->vitesse = 2; - } - } - - } - - else { - p->srcrect.y += p->srcrect.h * p->animFlip; - if((p->srcrect.y >= p->yMax || p->srcrect.y < 0) && !p->tir){ - p->animFlip = -p->animFlip; - p->srcrect.y += p->srcrect.h * p->animFlip; - } - } - return; -} - void detecter_collision_murs_ennemis(ListeR L, Perso *p, int xCamera, int yCamera){ int ax1, ax2, bx1, bx2, ay1, ay2, by1, by2; diff --git a/personnage.h b/personnage.h index ee5c867631e0e064f1cfe78ede803134f59f3041..9c338af665bd818a13879321229965482bb0bfcd 100644 --- a/personnage.h +++ b/personnage.h @@ -29,11 +29,11 @@ struct s_Personnage Perso nouveau_joueur(SDL_Renderer *renderer, SDL_Texture **sprites); Perso nouvel_ennemi_1(SDL_Renderer *renderer, ListeR LR, SDL_Texture **sprites, int xCamera, int yCamera); +Perso nouvel_ennemi_2(SDL_Renderer *renderer, ListeR LR, SDL_Texture **sprites, int xCamera, int yCamera); void afficher_perso(SDL_Renderer *renderer, Perso p); void charger_vagues_ennemis(int *tab); void deplacement_joueur(Perso *p, ListeR L, int *xCamera, int *yCamera, int *dxCamera, int *dyCamera); void angle_ennemi(Perso *p); void angle_joueur(Perso *p, float mouseX, float mouseY); -void animer_perso(Perso *p, Perso *joueur, SDL_Texture **sprites); void detecter_collision_murs_ennemis(ListeR L, Perso *p, int xCamera, int yCamera); void changer_arme_joueur(Perso *p, int arme, SDL_Texture **sprites); diff --git a/police.otf b/police.otf new file mode 100644 index 0000000000000000000000000000000000000000..39f43e2515ecec2267aed8dd0f28d4c35b2ee0e2 Binary files /dev/null and b/police.otf differ diff --git a/projectile.c b/projectile.c index 19322075397e9f49a57e96dae9eae770003e89ff..bc2d1da3e6353f2e98c3e59acba79dfb25916cea 100644 --- a/projectile.c +++ b/projectile.c @@ -9,17 +9,31 @@ balle nouvelle_balle(SDL_Texture *image, float angle, int degats, SDL_Rect perso b.image = image; b.ballePos = persoPos; b.degats = degats; + b.ennemi = false; + b.srcrect.x = 0; + b.srcrect.y = 0; + b.srcrect.w = persoPos.w; + b.srcrect.h = persoPos.h; return b; } -void incrementer_balle(balle *b, int v){ +void incrementer_balle(balle *b, int v, int dxCamera, int dyCamera){ b->ballePos.x += round(cos(b->angle * PI / 180) * v); b->ballePos.y += round(sin(b->angle * PI / 180) * v); + if(b->ennemi){ + b->ballePos.x -= dxCamera; + b->ballePos.y -= dyCamera; + } + return; } void afficher_balle(SDL_Renderer *renderer, balle b){ - SDL_RenderCopyEx(renderer, b.image, NULL, &b.ballePos, b.angle, NULL, SDL_FLIP_NONE); + if(b.ennemi){ + SDL_RenderCopyEx(renderer, b.image, &b.srcrect, &b.ballePos, b.angle + 90, NULL, SDL_FLIP_NONE); + } else { + SDL_RenderCopyEx(renderer, b.image, &b.srcrect, &b.ballePos, b.angle, NULL, SDL_FLIP_NONE); + } } diff --git a/projectile.h b/projectile.h index d3cc41cde2f7046d071ce7f6e36ab703d7d4ff55..441274ded78fcb5f585308b22f15ba6ad5ad5c0b 100644 --- a/projectile.h +++ b/projectile.h @@ -10,14 +10,15 @@ typedef struct s_Balle balle, s_Balle; struct s_Balle { - SDL_Rect ballePos; + SDL_Rect ballePos, srcrect; float angle; SDL_Texture *image; bool collision; + bool ennemi; int degats; }; balle nouvelle_balle(SDL_Texture *image, float angle, int degats, SDL_Rect persoPos); -void incrementer_balle(balle *b, int vitesse); +void incrementer_balle(balle *b, int vitesse, int dxCamera, int dyCamera); void afficher_balle(SDL_Renderer *renderer, balle b); diff --git a/sprites/ennemis/zombie/attack/zombie_attack.png b/sprites/ennemis/zombie/attack/ennemi1_attack.png similarity index 100% rename from sprites/ennemis/zombie/attack/zombie_attack.png rename to sprites/ennemis/zombie/attack/ennemi1_attack.png diff --git a/sprites/ennemis/zombie/attack/ennemi2_attack.png b/sprites/ennemis/zombie/attack/ennemi2_attack.png new file mode 100644 index 0000000000000000000000000000000000000000..bbb2bd57b44763e7a214b9e64a22552547aa7a7a Binary files /dev/null and b/sprites/ennemis/zombie/attack/ennemi2_attack.png differ diff --git a/sprites/ennemis/zombie/move/zombie_moveV2.png b/sprites/ennemis/zombie/move/ennemi1_move.png similarity index 100% rename from sprites/ennemis/zombie/move/zombie_moveV2.png rename to sprites/ennemis/zombie/move/ennemi1_move.png diff --git a/sprites/ennemis/zombie/move/ennemi2_move.png b/sprites/ennemis/zombie/move/ennemi2_move.png new file mode 100644 index 0000000000000000000000000000000000000000..924bb92e2a7ae406a7a44916ea74cc6e0cf0b32e Binary files /dev/null and b/sprites/ennemis/zombie/move/ennemi2_move.png differ diff --git a/sprites/projectiles/slime.png b/sprites/projectiles/slime.png new file mode 100644 index 0000000000000000000000000000000000000000..d38e889f7017f2a6f6ca8a55fccc814c7487f5bc Binary files /dev/null and b/sprites/projectiles/slime.png differ