Skip to content
Snippets Groups Projects
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
No related branches found
No related tags found
Loading
effets.c 0 → 100644
#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);
}
effets.h 0 → 100644
#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){ ...@@ -8,11 +8,12 @@ ListeB nouvelle_listeB(balle data){
return L; return L;
} }
ListeB cons_listeB(ListeB L, balle data){ void cons_listeB(ListeB *L, balle data){
ListeB tmp; ListeB tmp = malloc(sizeof(s_ListeB));
tmp = nouvelle_listeB(data); tmp->data = data;
tmp->next = L; tmp->next = *L;
return tmp; *L = tmp;
return ;
} }
bool est_vide_listeB(ListeB L) { bool est_vide_listeB(ListeB L) {
...@@ -21,7 +22,7 @@ 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){ if(LB == NULL){
return LB; return LB;
...@@ -38,7 +39,7 @@ ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, int v, int xCamera, i ...@@ -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 if(ballePos.x < 0 || ballePos.x >= 1000 || ballePos.y <= 0 || ballePos.y >= 700
|| detecter_collision_murs(LR, ballePos, xCamera, yCamera)){ || detecter_collision_murs(LR, ballePos, xCamera, yCamera)){
LB = LB->next; 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; ballePos.w = 6;
...@@ -46,13 +47,13 @@ ListeB incrementer_balles(ListeB LB, ListeP LP, ListeR LR, int v, int xCamera, i ...@@ -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.x = LB->data.ballePos.x - 3;
ballePos.y = LB->data.ballePos.y - 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; 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; return LB;
...@@ -67,21 +68,23 @@ void afficher_listeB(SDL_Renderer *renderer, ListeB L) { ...@@ -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 //Si perso en train de tirer
s_ListeP *tmp = LP; s_ListeP *tmp = LP;
while(tmp != NULL){ while(tmp != NULL){
if(tmp->data.tir){ if(tmp->data.tir){
//On fait pop une nouvelle balle toutes les X ms //On fait pop une nouvelle balle toutes les X ms
if(time > tmp->data.tempsTirPrecedent + 200) { 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->data.tempsTirPrecedent = time;
} }
} }
tmp = tmp->next; tmp = tmp->next;
} }
//On met a jour les coordonnes des balles dj tires, dpop si ncssaire //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; return LB;
} }
#include "listeP.h"
#include <stdio.h> #include <stdio.h>
#include "projectile.h" #include "projectile.h"
#include "listeP.h"
typedef struct s_ListeB *ListeB, s_ListeB; typedef struct s_ListeB *ListeB, s_ListeB;
struct s_ListeB struct s_ListeB
...@@ -10,8 +12,10 @@ struct s_ListeB ...@@ -10,8 +12,10 @@ struct s_ListeB
}; };
ListeB nouvelle_listeB(balle data); 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); 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); 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);
listeE.c 0 → 100644
#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;
}
}
listeE.h 0 → 100644
#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){ ...@@ -9,12 +9,16 @@ ListeP nouvelle_listeP(Perso data){
return L; return L;
} }
ListeP cons_listeP(ListeP L, Perso data){ void cons_listeP(ListeP *L, Perso data){
ListeP tmp = nouvelle_listeP(data); ListeP tmp = malloc(sizeof(s_ListeP));
tmp->next = L; tmp->data = data;
return tmp; tmp->next = *L;
*L = tmp;
return;
} }
bool est_vide_listeP(ListeP L){ bool est_vide_listeP(ListeP L){
return (L == NULL); return (L == NULL);
} }
...@@ -28,46 +32,46 @@ void afficher_listeP(SDL_Renderer *renderer, ListeP L){ ...@@ -28,46 +32,46 @@ void afficher_listeP(SDL_Renderer *renderer, ListeP L){
} }
Perso* joueur(ListeP L){ Perso* joueur(ListeP L){
s_ListeP *tmp = L; while(L != NULL){
while(tmp != NULL){ if(L->data.ennemi == false){
if(tmp->data.ennemi == false){ return &L->data;
return &tmp->data;
} }
tmp = tmp->next; L = L->next;
} }
return NULL; return NULL;
} }
void deplacement_ennemis(ListeP L, int xCamera, int yCamera, int dxCamera, int dyCamera){
ListeP deplacement_ennemis(ListeP L, int xCamera, int yCamera, int dxCamera, int dyCamera){ while(L != NULL){
if(L->data.vie <= 0){
if(L == NULL){ *L = *L->next;
return L; L = L->next;
} } else {
deplacement_ennemi(&L->data, xCamera, yCamera, dxCamera, dyCamera);
s_ListeP *tmp = L; L = L->next;
while(tmp != NULL){ }
deplacement_ennemi(&tmp->data, xCamera, yCamera, dxCamera, dyCamera);
tmp = tmp->next;
} }
return;
return L;
} }
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; int ax1, ax2, bx1, bx2, ay1, ay2, by1, by2;
Effet e;
while(L != NULL){ while(L != NULL){
ax1 = rect.x;//+ xCamera; ax1 = rect.x;
ax2 = rect.x + rect.w ;//+ xCamera; ax2 = rect.x + rect.w ;
bx1 = L->data.pos.x; bx1 = L->data.pos.x;
bx2 = L->data.pos.x + L->data.pos.w; bx2 = L->data.pos.x + L->data.pos.w;
ay1 = rect.y;// + yCamera; ay1 = rect.y;
ay2 = rect.y;// + rect.h + yCamera; ay2 = rect.y;
by1 = L->data.pos.y; by1 = L->data.pos.y;
by2 = L->data.pos.y + L->data.pos.h; by2 = L->data.pos.y + L->data.pos.h;
if(ax1 < bx2 && ax2 > bx1 && ay1 < by2 && ay2 > by1 && L->data.ennemi){ 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; return true;
} }
L = L->next; L = L->next;
...@@ -76,18 +80,14 @@ bool detecter_collision_perso(ListeP L, SDL_Rect rect, int xCamera, int yCamera) ...@@ -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){ while(L != NULL){
if(L->data.ennemi){ if(L->data.ennemi){
animer_perso(&L->data); animer_perso(&L->data);
} }
L = L->next; L = L->next;
} }
}
void animer_persos(ListeP L){
animer_persos2(L);
return; return;
} }
#include "personnage.h" #include "personnage.h"
#include <stdio.h> #include <stdio.h>
#include "listeE.h"
typedef struct s_ListeP *ListeP, s_ListeP; typedef struct s_ListeP *ListeP, s_ListeP;
...@@ -7,14 +9,18 @@ struct s_ListeP ...@@ -7,14 +9,18 @@ struct s_ListeP
{ {
ListeP next; ListeP next;
Perso data; Perso data;
}; };
ListeP nouvelle_listeP(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); bool est_vide_listeP(ListeP L);
void afficher_listeP(SDL_Renderer *renderer, ListeP L); void afficher_listeP(SDL_Renderer *renderer, ListeP L);
Perso* joueur(ListeP L); Perso* joueur(ListeP L);
ListeP deplacement_ennemis(ListeP L, int xCamera, int yCamera, int dxCamera, int dyCamera); void supprimer_ennemi(ListeP L);
bool detecter_collision_perso(ListeP L, SDL_Rect rect, int xCamera, int yCamera); 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_persos(ListeP L);
void animer_persos2(ListeP L);
...@@ -9,14 +9,16 @@ ListeR nouvelle_listeR(SDL_Rect data){ ...@@ -9,14 +9,16 @@ ListeR nouvelle_listeR(SDL_Rect data){
return L; return L;
} }
ListeR cons_listeR(ListeR L, SDL_Rect data){ void cons_listeR(ListeR *L, SDL_Rect data){
ListeR tmp = nouvelle_listeR(data); ListeR tmp = malloc(sizeof(s_ListeR));
tmp->next = L; tmp->data = data;
return tmp; 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) //on met toutes les case 0 pour dire que tout est du sol (provisoire)
for(int j = 0; j < 30; j++){ for(int j = 0; j < 30; j++){
for(int i = 0; i < 30; i++){ for(int i = 0; i < 30; i++){
...@@ -49,28 +51,28 @@ ListeR charger_niveau(int *tab, ListeR L){ ...@@ -49,28 +51,28 @@ ListeR charger_niveau(int *tab, ListeR L){
rect.y = j * 50; rect.y = j * 50;
rect.h = 25; rect.h = 25;
rect.w = 50; rect.w = 50;
L = cons_listeR(L, rect); cons_listeR(L, rect);
break; break;
case 2: case 2:
rect.x = i * 50; rect.x = i * 50;
rect.y = j * 50 + 25; rect.y = j * 50 + 25;
rect.h = 25; rect.h = 25;
rect.w = 50; rect.w = 50;
L = cons_listeR(L, rect); cons_listeR(L, rect);
break; break;
case 3: case 3:
rect.x = i * 50; rect.x = i * 50;
rect.y = j * 50; rect.y = j * 50;
rect.h = 50; rect.h = 50;
rect.w = 25; rect.w = 25;
L = cons_listeR(L, rect); cons_listeR(L, rect);
break; break;
case 4: case 4:
rect.x = i * 50 + 25; rect.x = i * 50 + 25;
rect.y = j * 50; rect.y = j * 50;
rect.h = 50; rect.h = 50;
rect.w = 25; rect.w = 25;
L = cons_listeR(L, rect); cons_listeR(L, rect);
break; break;
case 5: case 5:
...@@ -81,31 +83,30 @@ ListeR charger_niveau(int *tab, ListeR L){ ...@@ -81,31 +83,30 @@ ListeR charger_niveau(int *tab, ListeR L){
rect.y = j * 50; rect.y = j * 50;
rect.h = 50; rect.h = 50;
rect.w = 50; rect.w = 50;
L = cons_listeR(L, rect); cons_listeR(L, rect);
break; break;
} }
} }
} }
return L; return ;
} }
bool detecter_collision_murs(ListeR L, SDL_Rect rect, int xCamera, int yCamera){ 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; int ax1, ax2, bx1, bx2, ay1, ay2, by1, by2;
while(tmp != NULL){ while(L != NULL){
ax1 = rect.x + xCamera; ax1 = rect.x + xCamera;
ax2 = rect.x + rect.w + xCamera; ax2 = rect.x + rect.w + xCamera;
bx1 = tmp->data.x; bx1 = L->data.x;
bx2 = tmp->data.x + tmp->data.w; bx2 = L->data.x + L->data.w;
ay1 = rect.y + yCamera; ay1 = rect.y + yCamera;
ay2 = rect.y + rect.h + yCamera; ay2 = rect.y + rect.h + yCamera;
by1 = tmp->data.y; by1 = L->data.y;
by2 = tmp->data.y + tmp->data.h; by2 = L->data.y + L->data.h;
if(ax1 < bx2 && ax2 > bx1 && ay1 < by2 && ay2 > by1){ if(ax1 < bx2 && ax2 > bx1 && ay1 < by2 && ay2 > by1){
return true; return true;
} }
tmp = tmp->next; L = L->next;
} }
return false; return false;
} }
...@@ -10,6 +10,6 @@ struct s_ListeR ...@@ -10,6 +10,6 @@ struct s_ListeR
}; };
ListeR nouvelle_listeR(SDL_Rect data); ListeR nouvelle_listeR(SDL_Rect data);
ListeR cons_listeR(ListeR L, SDL_Rect data); void cons_listeR(ListeR *L, SDL_Rect data);
ListeR charger_niveau(int *tab, ListeR L); void charger_niveau(int *tab, ListeR *L);
bool detecter_collision_murs(ListeR L, SDL_Rect rect, int xCamera, int yCamera); bool detecter_collision_murs(ListeR L, SDL_Rect rect, int xCamera, int yCamera);
main.c 0 → 100644
#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;
}
//Dplacement/angle de tir ennemis
deplacement_ennemis(persosListe, xCamera, yCamera, dxCamera, dyCamera);
//Tir
tempsActuelTir = SDL_GetTicks();
ballesTirees = tir_update(ballesTirees, persosListe, mursListe, &effetsListe, tempsActuelTir, balleLongueJaune, vitesse, xCamera, yCamera, sprites);
//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_RenderPresent(ecran);
tempsPrecedent = tempsActuel;
}
}
//Nettoyage
SDL_DestroyWindow(fenetre);
SDL_DestroyTexture(fond);
SDL_DestroyTexture(perso);
IMG_Quit();
SDL_Quit();
return EXIT_SUCCESS;
}
#include "personnage.h"
Perso nouveau_joueur(SDL_Renderer *renderer, SDL_Texture **sprites){
Perso p;
p.tempsTirPrecedent = 0;
p.image = sprites[0];
p.pos.x = 480;
p.pos.y = 330;
p.pos.w = 40;
p.pos.h = 40;
p.srcrect.x = 0;
p.srcrect.y = 0;
p.srcrect.w = 258;
p.srcrect.h = 220;
p.angle = 0;
p.vie = 100;
p.degats = 25;
p.vitesse = 4;
p.tir = false;
p.ennemi = false;
p.animFlip = 1;
return p;
}
Perso nouvel_ennemi_1(SDL_Renderer *renderer, SDL_Texture **sprites){
Perso p;
p.tempsTirPrecedent = 0;
p.image = sprites[1];
//gnre des coordonnes de spawn alatoires(provisoire)
p.pos.x = rand()%100 + 0;
p.pos.y = rand()%700 + 0;
p.pos.w = 60;
p.pos.h = 60;
p.srcrect.x = 0;
p.srcrect.y = 0;
p.srcrect.w = 288;
p.srcrect.h = 311;
p.angle = 0;
p.vie = 100;
p.degats = 10;
p.vitesse = 2;
p.tir = false;
p.ennemi = true;
p.animFlip = 1;
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);
}
void deplacement_joueur(Perso *p, ListeR L, int *xCamera, int *yCamera, int *dxCamera, int *dyCamera)
{
int dX = 0;
int dY = 0;
const Uint8 *state = SDL_GetKeyboardState(NULL);
if(state[SDL_GetScancodeFromKey(SDLK_z)]){
dY -= 1;
}
if(state[SDL_GetScancodeFromKey(SDLK_s)]){
dY += 1;
}
if(state[SDL_GetScancodeFromKey(SDLK_q)]){
dX -= 1;
}
if(state[SDL_GetScancodeFromKey(SDLK_d)]){
dX += 1;
}
dX = dX * p->vitesse;
dY = dY * p->vitesse;
*xCamera += dX;
*yCamera += dY;
*dxCamera = dX;
*dyCamera = dY;
if(detecter_collision_murs(L, p->pos, *xCamera, *yCamera)){
*xCamera -= dX;
*dxCamera = 0;
if(detecter_collision_murs(L, p->pos, *xCamera, *yCamera)){
*xCamera += dX;
*dxCamera = dX;
*yCamera -= dY;
*dyCamera = 0;
if(detecter_collision_murs(L, p->pos, *xCamera, *yCamera)){
*xCamera -= dX;
*dxCamera = 0;
}
}
}
return;
}
void deplacement_ennemi(Perso *p, int xCamera, int yCamera, int dxCamera, int dyCamera){
if(p != NULL){
if(p->ennemi){
//Mj de la direction du perso
angle_ennemi(p);
//Compensation du dcalage de la camra + ajout du dplacement
p->pos.x += round(-dxCamera + cos(p->angle) * p->vitesse);
p->pos.y += round(-dyCamera + sin(p->angle) * p->vitesse);
p->angle = (p->angle * 180.0000)/PI;
}
}
return;
}
void angle_joueur(Perso *p, float mouseX, float mouseY){
float angle;
angle = atan2(mouseY - (p->pos.y + 20), mouseX - (p->pos.x + 20));
angle = (angle * 180.0000)/PI;
p->angle = angle;
return;
}
void angle_ennemi(Perso *p){
float angle;
angle = atan2( 350 - (p->pos.y + 20), 500 - (p->pos.x + 20));
p->angle = angle;
return;
}
void animer_perso(Perso *p){
p->srcrect.y += p->srcrect.h * p->animFlip;
if(p->srcrect.y > 4976|| p->srcrect.y < 0){
p->animFlip = -p->animFlip;
p->srcrect.y += p->srcrect.h * p->animFlip;
}
return;
}
...@@ -16,6 +16,7 @@ struct s_Personnage ...@@ -16,6 +16,7 @@ struct s_Personnage
float angle; float angle;
int tempsTirPrecedent; int tempsTirPrecedent;
int vie; int vie;
int degats;
int vitesse; int vitesse;
int animFlip; int animFlip;
bool tir; bool tir;
......
#include "projectile.h" #include "projectile.h"
balle nouvelle_balle(SDL_Texture *image, float angle, SDL_Rect persoPos) balle nouvelle_balle(SDL_Texture *image, float angle, int degats, SDL_Rect persoPos)
{ {
balle b; balle b;
b.angle = angle; b.angle = angle;
b.collision = false; b.collision = false;
b.image = image; b.image = image;
b.ballePos = persoPos; b.ballePos = persoPos;
b.degats = degats;
return b; return b;
} }
......
...@@ -11,9 +11,10 @@ struct s_Balle ...@@ -11,9 +11,10 @@ struct s_Balle
float angle; float angle;
SDL_Texture *image; SDL_Texture *image;
bool collision; bool collision;
int degats;
}; };
balle nouvelle_balle(SDL_Texture *image, float angle, SDL_Rect persoPos); 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);
void afficher_balle(SDL_Renderer *renderer, balle b); void afficher_balle(SDL_Renderer *renderer, balle b);
sprites/effets/blood/blood_hitv3.png

8.62 KiB

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment