Commit 28eff848 authored by Paul GEORGES's avatar Paul GEORGES
Browse files

degats + effets

Ajout degats/mort ennemis, ajout effets, modifications mineures fonctions Listes
parent fb37d6f4
#include "effets.h"
Effet nouvel_effet_bloodHit(SDL_Texture **sprites, SDL_Rect pos, int angle){
Effet e;
e.pos = pos;
e.srcrect.x = 0;
e.srcrect.y = 0;
e.srcrect.w = 128;
e.srcrect.h = 128;
e.image = sprites[2];
e.angle = angle - 90;
e.xMax = 1920;
return e;
}
void afficher_effet(SDL_Renderer *renderer, Effet e){
SDL_RenderCopyEx(renderer, e.image, &e.srcrect, &e.pos, e.angle, NULL, SDL_FLIP_NONE);
}
#include <SDL2/SDL.h>
typedef struct s_Effet Effet, s_Effet;
struct s_Effet
{
SDL_Rect pos;
SDL_Rect srcrect;
SDL_Texture *image;
float angle;
int xMax;
};
Effet nouvel_effet_bloodHit(SDL_Texture **sprites, SDL_Rect pos, int angle);
void afficher_effet(SDL_Renderer *renderer, Effet e);
......@@ -8,11 +8,12 @@ ListeB nouvelle_listeB(balle data){
return L;
}
ListeB cons_listeB(ListeB L, balle data){
ListeB tmp;
tmp = nouvelle_listeB(data);
tmp->next = L;
return tmp;
void cons_listeB(ListeB *L, balle data){
ListeB tmp = malloc(sizeof(s_ListeB));
tmp->data = data;
tmp->next = *L;
*L = tmp;
return ;
}
bool est_vide_listeB(ListeB L) {
......@@ -21,7 +22,7 @@ bool est_vide_listeB(ListeB L) {
ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, int v, int xCamera, int yCamera)
ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int v, int xCamera, int yCamera, SDL_Texture **sprites)
{
if(LB == NULL){
return LB;
......@@ -38,7 +39,7 @@ ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, int v, int xCamera, i
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, v, xCamera, yCamera);
return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, sprites);
}
ballePos.w = 6;
......@@ -46,13 +47,13 @@ ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, int v, int xCamera, i
ballePos.x = LB->data.ballePos.x - 3;
ballePos.y = LB->data.ballePos.y - 3;
if(detecter_collision_perso(LP, ballePos, xCamera, yCamera)) {
if(detecter_collision_perso(LP, LE, ballePos, LB->data.degats ,xCamera, yCamera, sprites)) {
LB = LB->next;
return incrementer_balles(LB, LP, LR, v, xCamera, yCamera);
return incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, sprites);
}
LB->next = incrementer_balles(LB->next, LP, LR, v, xCamera, yCamera);
LB->next = incrementer_balles(LB->next, LP, LR, LE, v, xCamera, yCamera, sprites);
return LB;
......@@ -67,21 +68,23 @@ void afficher_listeB(SDL_Renderer *renderer, ListeB L) {
}
}
ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, int time, SDL_Texture *balleLongueJaune, int v, int xCamera, int yCamera){
ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, SDL_Texture *balleLongueJaune, int v, int xCamera, int yCamera, SDL_Texture **sprites){
//Si perso en train de tirer
s_ListeP *tmp = LP;
while(tmp != NULL){
if(tmp->data.tir){
//On fait pop une nouvelle balle toutes les X ms
if(time > tmp->data.tempsTirPrecedent + 200) {
LB = cons_listeB(LB, nouvelle_balle(balleLongueJaune, tmp->data.angle, tmp->data.pos));
cons_listeB(&LB, nouvelle_balle(balleLongueJaune, tmp->data.angle, tmp->data.degats, tmp->data.pos));
tmp->data.tempsTirPrecedent = time;
}
}
tmp = tmp->next;
}
//On met a jour les coordonnes des balles dj tires, dpop si ncssaire
LB = incrementer_balles(LB, LP, LR, v, xCamera, yCamera);
LB = incrementer_balles(LB, LP, LR, LE, v, xCamera, yCamera, sprites);
return LB;
}
#include "listeP.h"
#include <stdio.h>
#include "projectile.h"
#include "listeP.h"
typedef struct s_ListeB *ListeB, s_ListeB;
struct s_ListeB
......@@ -10,8 +12,10 @@ struct s_ListeB
};
ListeB nouvelle_listeB(balle data);
ListeB cons_listeB(ListeB L, balle data);
void cons_listeB(ListeB *L, balle data);
bool est_vide_listeB(ListeB L);
ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, int v, int xCamera, int yCamera);
ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int v, int xCamera, int yCamera, SDL_Texture **sprites);
void afficher_listeB(SDL_Renderer *renderer, ListeB L);
ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, int time, SDL_Texture *balleLongueJaune, int v, int xCamera, int yCamera);
ListeB tir_update(ListeB LB, ListeP LP, ListeR LR, ListeE *LE, int time, SDL_Texture *balleLongueJaune, int v, int xCamera, int yCamera, SDL_Texture **sprites);
#include "listeE.h"
void cons_listeE(ListeE *L, Effet data){
ListeE tmp = malloc(sizeof(s_ListeE));
tmp->data = data;
tmp->next = *L;
*L = tmp;
return;
}
void animer_effets(ListeE L){
ListeE tmp;
while(L != NULL){
L->data.srcrect.y += L->data.srcrect.h;
if(L->data.srcrect.y >= L->data.xMax){
if(L->next == NULL){
tmp = NULL;
L = tmp;
} else {
tmp = malloc(sizeof(s_ListeE));
tmp->data = L->next->data;
tmp->next = L->next->next;
*L = *tmp;
}
} else {
L = L->next;
}
}
return;
}
void afficher_listeE(SDL_Renderer *renderer, ListeE L, int dxCamera, int dyCamera){
ListeE tmp = L;
while(tmp != NULL) {
tmp->data.pos.x -= dxCamera;
tmp->data.pos.y -= dyCamera;
afficher_effet(renderer, tmp->data);
tmp = tmp->next;
}
}
#include "effets.h"
#include <stdlib.h>
typedef struct s_ListeE *ListeE, s_ListeE;
struct s_ListeE
{
ListeE next;
Effet data;
};
void cons_listeE(ListeE *L, Effet e);
void afficher_listeE(SDL_Renderer *renderer, ListeE L, int dxCamera, int dyCamera);
void animer_effets(ListeE L);
......@@ -9,12 +9,16 @@ ListeP nouvelle_listeP(Perso data){
return L;
}
ListeP cons_listeP(ListeP L, Perso data){
ListeP tmp = nouvelle_listeP(data);
tmp->next = L;
return tmp;
void cons_listeP(ListeP *L, Perso data){
ListeP tmp = malloc(sizeof(s_ListeP));
tmp->data = data;
tmp->next = *L;
*L = tmp;
return;
}
bool est_vide_listeP(ListeP L){
return (L == NULL);
}
......@@ -28,46 +32,46 @@ void afficher_listeP(SDL_Renderer *renderer, ListeP L){
}
Perso* joueur(ListeP L){
s_ListeP *tmp = L;
while(tmp != NULL){
if(tmp->data.ennemi == false){
return &tmp->data;
while(L != NULL){
if(L->data.ennemi == false){
return &L->data;
}
tmp = tmp->next;
L = L->next;
}
return NULL;
}
ListeP deplacement_ennemis(ListeP L, int xCamera, int yCamera, int dxCamera, int dyCamera){
if(L == NULL){
return L;
}
s_ListeP *tmp = L;
while(tmp != NULL){
deplacement_ennemi(&tmp->data, xCamera, yCamera, dxCamera, dyCamera);
tmp = tmp->next;
void deplacement_ennemis(ListeP L, int xCamera, int yCamera, int dxCamera, int dyCamera){
while(L != NULL){
if(L->data.vie <= 0){
*L = *L->next;
L = L->next;
} else {
deplacement_ennemi(&L->data, xCamera, yCamera, dxCamera, dyCamera);
L = L->next;
}
}
return L;
return;
}
bool detecter_collision_perso(ListeP L, SDL_Rect rect, int xCamera, int yCamera){
bool detecter_collision_perso(ListeP L, ListeE *LE, SDL_Rect rect, int degats, int xCamera, int yCamera, SDL_Texture **sprites){
int ax1, ax2, bx1, bx2, ay1, ay2, by1, by2;
Effet e;
while(L != NULL){
ax1 = rect.x;//+ xCamera;
ax2 = rect.x + rect.w ;//+ xCamera;
ax1 = rect.x;
ax2 = rect.x + rect.w ;
bx1 = L->data.pos.x;
bx2 = L->data.pos.x + L->data.pos.w;
ay1 = rect.y;// + yCamera;
ay2 = rect.y;// + rect.h + yCamera;
ay1 = rect.y;
ay2 = rect.y;
by1 = L->data.pos.y;
by2 = L->data.pos.y + L->data.pos.h;
if(ax1 < bx2 && ax2 > bx1 && ay1 < by2 && ay2 > by1 && L->data.ennemi){
L->data.vie -= degats;
e = nouvel_effet_bloodHit(sprites, L->data.pos, L->data.angle);
cons_listeE(LE, e);
return true;
}
L = L->next;
......@@ -76,18 +80,14 @@ bool detecter_collision_perso(ListeP L, SDL_Rect rect, int xCamera, int yCamera)
}
void animer_persos2(ListeP L){
void animer_persos(ListeP L){
while(L != NULL){
if(L->data.ennemi){
animer_perso(&L->data);
}
L = L->next;
}
}
void animer_persos(ListeP L){
animer_persos2(L);
return;
}
#include "personnage.h"
#include <stdio.h>
#include <stdio.h>
#include "listeE.h"
typedef struct s_ListeP *ListeP, s_ListeP;
......@@ -7,14 +9,18 @@ struct s_ListeP
{
ListeP next;
Perso data;
};
};
ListeP nouvelle_listeP(Perso data);
ListeP cons_listeP(ListeP L, Perso data);
void cons_listeP(ListeP *L, Perso data);
bool est_vide_listeP(ListeP L);
void afficher_listeP(SDL_Renderer *renderer, ListeP L);
Perso* joueur(ListeP L);
ListeP deplacement_ennemis(ListeP L, int xCamera, int yCamera, int dxCamera, int dyCamera);
bool detecter_collision_perso(ListeP L, SDL_Rect rect, int xCamera, int yCamera);
void supprimer_ennemi(ListeP L);
void deplacement_ennemis(ListeP L, int xCamera, int yCamera, int dxCamera, int dyCamera);
bool detecter_collision_perso(ListeP L, ListeE *LE, SDL_Rect rect, int degats, int xCamera, int yCamera, SDL_Texture **sprites);
void animer_persos(ListeP L);
void animer_persos2(ListeP L);
......@@ -9,14 +9,16 @@ ListeR nouvelle_listeR(SDL_Rect data){
return L;
}
ListeR cons_listeR(ListeR L, SDL_Rect data){
ListeR tmp = nouvelle_listeR(data);
tmp->next = L;
return tmp;
void cons_listeR(ListeR *L, SDL_Rect data){
ListeR tmp = malloc(sizeof(s_ListeR));
tmp->data = data;
tmp->next = *L;
*L = tmp;
return;
}
ListeR charger_niveau(int *tab, ListeR L){
void charger_niveau(int *tab, ListeR *L){
//on met toutes les case 0 pour dire que tout est du sol (provisoire)
for(int j = 0; j < 30; j++){
for(int i = 0; i < 30; i++){
......@@ -49,28 +51,28 @@ ListeR charger_niveau(int *tab, ListeR L){
rect.y = j * 50;
rect.h = 25;
rect.w = 50;
L = cons_listeR(L, rect);
cons_listeR(L, rect);
break;
case 2:
rect.x = i * 50;
rect.y = j * 50 + 25;
rect.h = 25;
rect.w = 50;
L = cons_listeR(L, rect);
cons_listeR(L, rect);
break;
case 3:
rect.x = i * 50;
rect.y = j * 50;
rect.h = 50;
rect.w = 25;
L = cons_listeR(L, rect);
cons_listeR(L, rect);
break;
case 4:
rect.x = i * 50 + 25;
rect.y = j * 50;
rect.h = 50;
rect.w = 25;
L = cons_listeR(L, rect);
cons_listeR(L, rect);
break;
case 5:
......@@ -81,31 +83,30 @@ ListeR charger_niveau(int *tab, ListeR L){
rect.y = j * 50;
rect.h = 50;
rect.w = 50;
L = cons_listeR(L, rect);
cons_listeR(L, rect);
break;
}
}
}
return L;
return ;
}
bool detecter_collision_murs(ListeR L, SDL_Rect rect, int xCamera, int yCamera){
s_ListeR *tmp = L;
int ax1, ax2, bx1, bx2, ay1, ay2, by1, by2;
while(tmp != NULL){
while(L != NULL){
ax1 = rect.x + xCamera;
ax2 = rect.x + rect.w + xCamera;
bx1 = tmp->data.x;
bx2 = tmp->data.x + tmp->data.w;
bx1 = L->data.x;
bx2 = L->data.x + L->data.w;
ay1 = rect.y + yCamera;
ay2 = rect.y + rect.h + yCamera;
by1 = tmp->data.y;
by2 = tmp->data.y + tmp->data.h;
by1 = L->data.y;
by2 = L->data.y + L->data.h;
if(ax1 < bx2 && ax2 > bx1 && ay1 < by2 && ay2 > by1){
return true;
}
tmp = tmp->next;
L = L->next;
}
return false;
}
......@@ -10,6 +10,6 @@ struct s_ListeR
};
ListeR nouvelle_listeR(SDL_Rect data);
ListeR cons_listeR(ListeR L, SDL_Rect data);
ListeR charger_niveau(int *tab, ListeR L);
void cons_listeR(ListeR *L, SDL_Rect data);
void charger_niveau(int *tab, ListeR *L);
bool detecter_collision_murs(ListeR L, SDL_Rect rect, int xCamera, int yCamera);
#include "image.h"
#include "listeB.h"
int main(int argc, char *argv[])
{
srand(time(NULL));
bool gameover = false;
bool tir = false;
SDL_Window *fenetre;
SDL_Event evenements;
SDL_Renderer *ecran;
SDL_Texture *fond, *perso, *balleLongueJaune;
SDL_Rect persoPos;
float mouseX, mouseY;
int vitesse = 25, tempsActuel = 0, tempsPrecedent = 0, tempsActuelTir = 0, tempsActuelAnim = 0, tempsPrecedentAnim = 0;
ListeB ballesTirees;
ListeP persosListe;
ListeR mursListe;
ListeE effetsListe;
Perso *joueur_ptr;
SDL_Texture *sprites[3];
SDL_Texture *spritesMap[9];
int xCamera = 0, yCamera = 0, dxCamera = 0, dyCamera = 0;
int map[30][30];
//Initialisation SDL
if(SDL_Init(SDL_INIT_VIDEO < 0))
{
printf("Erreur d'initialisation de la SDL %s", SDL_GetError());
SDL_Quit();
return EXIT_FAILURE;
}
//Initialisation SDL_image (PNG)
IMG_Init(IMG_INIT_PNG);
//Cration fentre
fenetre = SDL_CreateWindow("gameName", 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;
}
//Cration renderer
ecran = SDL_CreateRenderer(fenetre, -1, SDL_RENDERER_ACCELERATED);
//Chargement images
balleLongueJaune = charger_image("sprites/projectiles/balle/balle_longue_jaune.png", ecran, 255, 255, 255);
//Chargement du dcor (murs etc)
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);
fond = charger_image("sprites/fond.png", ecran, -1, -1, -1);
perso = charger_image("sprites/perso/handgun/idle/survivor_idle.png", ecran, 255, 255, 255);
sprites[0] = perso;
perso = charger_image("sprites/ennemis/zombie/move/zombie_move.png", ecran, 255, 255, 255);
sprites[1] = perso;
perso = charger_image("sprites/effets/blood/blood_hitv3.png", ecran, 0, 0, -1);
sprites[2] = perso;
SDL_Rect tmpRect;
tmpRect.x = 0;
tmpRect.y = 0;
tmpRect.w = 0;
tmpRect.h = 0;
mursListe = nouvelle_listeR(tmpRect);
charger_niveau(map[0], &mursListe);
Perso p = nouveau_joueur(ecran , sprites);
persosListe = nouvelle_listeP(p);
p = nouvel_ennemi_1(ecran, sprites);
cons_listeP(&persosListe, p);
p = nouvel_ennemi_1(ecran, sprites);
cons_listeP(&persosListe, p);
p = nouvel_ennemi_1(ecran, sprites);
cons_listeP(&persosListe, p);
p = nouvel_ennemi_1(ecran, sprites);
cons_listeP(&persosListe, p);
p = nouvel_ennemi_1(ecran, sprites);
cons_listeP(&persosListe, p);
p = nouvel_ennemi_1(ecran, sprites);
cons_listeP(&persosListe, p);
balle b = nouvelle_balle(balleLongueJaune, 0, 0, persoPos);
ballesTirees = nouvelle_listeB(b);
effetsListe = NULL;
//Boucle de jeu
while(!gameover)
{
//Petit timer pour pas dpasser 60 excutions/sec (provisoire)
tempsActuel = SDL_GetTicks();
if (tempsActuel > tempsPrecedent + 16)
{
//Dtection vnements
while(SDL_PollEvent(&evenements))
{
switch(evenements.type)
{
case SDL_QUIT:
gameover = true;
break;
case SDL_MOUSEMOTION:
mouseX = evenements.motion.x;
mouseY = evenements.motion.y;
break;
case SDL_MOUSEBUTTONDOWN:
switch(evenements.button.button)
{
case SDL_BUTTON_LEFT:
tir = true;
break;
}
break;
case SDL_MOUSEBUTTONUP:
switch(evenements.button.button)
{
case SDL_BUTTON_LEFT:
tir = false;
break;
}
break;
case SDL_KEYDOWN:
switch(evenements.key.keysym.sym)
{
case SDLK_ESCAPE:
gameover = true;
break;
}
break;
}
}
joueur_ptr = joueur(persosListe);
if(joueur_ptr != NULL){
//Gestion dplacement/angle de tir
joueur_ptr->tir = tir;
deplacement_joueur(joueur_ptr, mursListe, &xCamera, &yCamera, &dxCamera, &dyCamera);
angle_joueur((joueur_ptr), mouseX, mouseY);
}
tempsActuelAnim = SDL_GetTicks();
if(tempsActuelAnim > tempsPrecedentAnim + 40 ){
animer_persos(persosListe);
animer_effets(effetsListe);
tempsPrecedentAnim = tempsActuelAnim;
}