diff --git a/test2.c b/test2.c index e7e2a8a..1280cdd 100644 --- a/test2.c +++ b/test2.c @@ -2,239 +2,148 @@ #include #include"Graphique/libgraph.h" #include -#include "main.h" +#include "test2.h" #include #include - -static SDL_Surface *surface; - -int vaisseauID = -1; -int envahisseurID = -1; -int missileID = -1; -int bombeID = -1; - - -void initListe(listeEntites* liste) { - liste->tete = NULL; -} - - -void ajouterEntite(listeEntites* liste, int x, int y, int type, int etat) { - entite* nouvelleEntite = (entite*)malloc(sizeof(entite)); - if (!nouvelleEntite) { - fprintf(stderr, "Erreur : impossible d'allouer la mémoire pour une nouvelle entité.\n"); - exit(EXIT_FAILURE); - } - nouvelleEntite->x = x; - nouvelleEntite->y = y; - nouvelleEntite->type = type; - nouvelleEntite->etat = etat; - nouvelleEntite->suivante = liste->tete; - liste->tete = nouvelleEntite; - printf("Ajouté entité de type %d à (%d, %d)\n", type, x, y); -} - - -void initEnvahisseurs(listeEntites* liste, int nbEnvahisseurs, int y) { - for (int i = 0; i < nbEnvahisseurs; i++) { - ajouterEntite(liste, i * 40, y, 1, 1); // Type 1 pour envahisseur - } - printf("Initialisé %d envahisseurs à la position y = %d\n", nbEnvahisseurs, y); -} - - -void initVaisseau(entite* vaisseau, int x, int y) { - vaisseau->x = x; - vaisseau->y = y; - vaisseau->type = 0; - vaisseau->etat = 1; - vaisseau->suivante = NULL; - printf("Initialisé vaisseau à (%d, %d)\n", x, y); -} - - -void deplacerEnvahisseurs(listeEntites* envahisseurs, int largeurEcran, int* direction, bool* bordAtteint) { - entite* courant = envahisseurs->tete; - while (courant != NULL) { - courant->x += *direction * 10; - - - if (courant->x <= 0 || courant->x >= largeurEcran - 40) { - *bordAtteint = true; - } - - courant = courant->suivante; - } - - - if (*bordAtteint) { - *direction = -*direction; - courant = envahisseurs->tete; - while (courant != NULL) { - courant->y += 10; - courant = courant->suivante; - } - *bordAtteint = false; - printf("Les envahisseurs ont changé de direction\n"); - } -} - - -void gererEntrees(entite* vaisseau, listeEntites* missiles) { - const Uint8* etatClavier = SDL_GetKeyState(NULL); - - if (etatClavier[SDLK_LEFT]) { - vaisseau->x -= 10; - } - if (etatClavier[SDLK_RIGHT]) { - vaisseau->x += 10; - } - if (etatClavier[SDLK_SPACE]) { - - ajouterEntite(missiles, vaisseau->x + 20, vaisseau->y - 10, 2, 1); - printf("Missile tiré à (%d, %d)\n", vaisseau->x + 20, vaisseau->y - 10); - } -} - - -bool collision(entite* a, entite* b) { - return (a->x < b->x + 40 && - a->x + 40 > b->x && - a->y < b->y + 40 && - a->y + 40 > b->y); +#define TAILLE_X 700 +#define TAILLE_DESC 40 +#define LARGEUR_MONS 30 +#define HAUTEUR_MONS 30 +#define LARGEUR_VAIS 35 +#define SPEED 1 +#define MISS_SPEED 5 +#define LARGEUR_MISS 5 +#define HAUTEUR_MISS 10 + + + + +l_entite* create_l_entite(int x,int y,int speed,int image) +{ + l_entite* monster_1 =(l_entite*)malloc(sizeof(l_entite)); + (monster_1->ent).image=image; + (monster_1->ent).x =x; + (monster_1->ent).y =y; + (monster_1->ent).speed=speed; + monster_1->next = NULL; + return monster_1; } -entite* collisionAvecListe(entite* ent, listeEntites* liste) { - entite* courant = liste->tete; - while (courant != NULL) { - if (collision(ent, courant)) { - return courant; - } - courant = courant->suivante; - } - return NULL; +entite create_entite(entite ent,int x,int y, int speed, int image) +{ + (ent).image=image; + (ent).x =x; + (ent).y =y; + (ent).speed=speed; + return ent; } -int chargerSprites() { - vaisseauID = chargerLutin("invader_canon.bmp", 0); - envahisseurID = chargerLutin("invader_monstre1_1.bmp", 1); - missileID = chargerLutin("invader_missile.bmp", 2); - bombeID = chargerLutin("invader_bombe.bmp", 3); - - if (vaisseauID < 0) { - fprintf(stderr, "Erreur : échec du chargement du lutin vaisseau.\n"); - return 0; - } - if (envahisseurID < 0) { - fprintf(stderr, "Erreur : échec du chargement du lutin envahisseur.\n"); - return 0; - } - if (missileID < 0) { - fprintf(stderr, "Erreur : échec du chargement du lutin missile.\n"); - return 0; - } - if (bombeID < 0) { - fprintf(stderr, "Erreur : échec du chargement du lutin bombe.\n"); - return 0; + +void add_entite (l_entite** head,int x,int y,int speed,int image) +{ + + l_entite* new_monster = create_l_entite( x, y,speed,image); + if (head==NULL) + { + *head=new_monster; + } + else + { + l_entite* current =*head; + while (current->next != NULL) + { current=current->next; + } + current->next=new_monster; } - printf("Sprites chargés avec succès\n"); - return 1; } -void afficherEntite(entite* ent) { - int lutinID; - switch (ent->type) { - case 0: lutinID = vaisseauID; break; - case 1: lutinID = envahisseurID; break; - case 2: lutinID = missileID; break; - case 3: lutinID = bombeID; break; - default: - fprintf(stderr, "Erreur : type de lutin inconnu %d.\n", ent->type); - return; +void display_l_entite(l_entite* mons) +{ + l_entite* ptr= mons; + while(ptr != NULL) + { + afficherLutin((ptr->ent).image,(ptr->ent).x,(ptr->ent).y); + ptr=ptr->next; } - afficherLutin(lutinID, ent->x, ent->y); - printf("Affichage de l'entité de type %d à (%d, %d)\n", ent->type, ent->x, ent->y); } +void display_entite(entite ent) + { + afficherLutin((ent).image,(ent).x,(ent).y); + } -int main() { - if (!creerSurface(800, 600, "Space Invaders")) { - fprintf(stderr, "Erreur lors de la création de la surface graphique.\n"); - return EXIT_FAILURE; - } - - if (!chargerSprites()) { - fprintf(stderr, "Erreur lors du chargement des sprites.\n"); - fermerSurface(); - return EXIT_FAILURE; - } - - listeEntites envahisseurs; - listeEntites missiles; - initListe(&envahisseurs); - initListe(&missiles); - - entite vaisseau; - initVaisseau(&vaisseau, 380, 550); - - initEnvahisseurs(&envahisseurs, 10, 50); - - int direction = 1; - bool bordAtteint = false; - -while(!getchar()) +void moveMonster(l_entite* monstre) { - deplacerEnvahisseurs(&envahisseurs, 800, &direction, &bordAtteint); - entite* missile = missiles.tete; - while (missile != NULL) { - entite* cible = collisionAvecListe(missile, &envahisseurs); - if (cible != NULL) { - missile->etat = 0; - cible->etat = 0; - printf("Collision détectée entre missile et envahisseur\n"); - } - missile = missile->suivante; - } - - - - - - - entite* courant = envahisseurs.tete; - while (courant != NULL) { - if (courant->etat == 1) { - afficherEntite(courant); - } - courant = courant->suivante; - } - - if (vaisseau.etat == 1) { - afficherEntite(&vaisseau); - } - - missile = missiles.tete; - while (missile != NULL) { - if (missile->etat == 1) { - afficherEntite(missile); - } - missile = missile->suivante; - } - - SDL_Flip(surface); + int max = TAILLE_X - LARGEUR_MONS; + l_entite* currentMonster = monstre; + while (currentMonster != NULL) + { + (currentMonster->ent).x += (currentMonster->ent).speed; + + if ( (currentMonster->ent).x < 0 || (currentMonster->ent).x > max) + { + (currentMonster->ent).speed = -(currentMonster->ent).speed; + (currentMonster->ent).y += TAILLE_DESC ; + } + + currentMonster = currentMonster->next; } - - fermerSurface(); - return 0; - - } -// calcul de collision entre l'ensemble des missiles et la liste d'entité - - - +int main() +{ + l_entite* W_monster = NULL; + l_entite* B_monster = NULL; + l_entite* l_missile = NULL; + entite vaisseau; + entite missile; + entite missile_ref; + creerSurface(TAILLE_X,TAILLE_Y,"Space Invaders"); + + + + int ZB=lutinTexte("Space invaders", COULEUR_BLEU); + int M1=chargerLutin("Graphique/invader_monstre1_2.bmp", COULEUR_BLEU); + int M2=chargerLutin("Graphique/invader_monstre2_1.bmp", COULEUR_BLEU); + int V =chargerLutin("Graphique/invader_canon.bmp", COULEUR_BLEU); + int MI =chargerLutin("Graphique/invader_missile.bmp", COULEUR_BLEU); + + + + W_monster =create_l_entite(0,0,1,M1); + B_monster =create_l_entite(0,100,1,M2); + vaisseau =create_entite(vaisseau,0.5*TAILLE_X,0.95*TAILLE_Y,1,V); + missile_ref =create_entite(missile_ref,vaisseau.x + (LARGEUR_VAIS/2),400,1,MI); + l_missile =create_l_entite( vaisseau.x + (LARGEUR_VAIS/2),(vaisseau).y,1,MI); + + int i=0;int a =60; + for (i=0;i<4;i++) + { + add_entite(&W_monster,((W_monster->ent).x)+a,(W_monster->ent).y,1,M1); + add_entite(&B_monster,((B_monster->ent).x)+a,(B_monster->ent).y,1,M2); + a+=60; + } + + + + while(1) + { + evenement ev; + char touche; + l_missile = NULL; + lireEvenement(&ev,&touche,NULL); + if(ev==quitter) + {break; + } + rectanglePlein (0,0,TAILLE_X,TAILLE_Y,COULEUR_NOIR); + display_l_entite(W_monster); + display_l_entite(B_monster); + display_entite(vaisseau); + moveMonster( W_monster); + moveMonster( B_monster); + } + } \ No newline at end of file -- libgit2 0.21.2