Commit 579e0a0f43e1ea123c4d47fdbd409222831cdabf

Authored by mahmoudrabia
1 parent 8959b9d7

rapport intermediaire

Showing 1 changed file with 240 additions and 0 deletions   Show diff stats
test2.c 0 → 100644
@@ -0,0 +1,240 @@ @@ -0,0 +1,240 @@
  1 +#include<SDL/SDL.h>
  2 +#include<SDL/SDL_ttf.h>
  3 +#include"Graphique/libgraph.h"
  4 +#include<stdbool.h>
  5 +#include "main.h"
  6 +#include <stdio.h>
  7 +#include <stdlib.h>
  8 +
  9 +static SDL_Surface *surface;
  10 +
  11 +int vaisseauID = -1;
  12 +int envahisseurID = -1;
  13 +int missileID = -1;
  14 +int bombeID = -1;
  15 +
  16 +
  17 +void initListe(listeEntites* liste) {
  18 + liste->tete = NULL;
  19 +}
  20 +
  21 +
  22 +void ajouterEntite(listeEntites* liste, int x, int y, int type, int etat) {
  23 + entite* nouvelleEntite = (entite*)malloc(sizeof(entite));
  24 + if (!nouvelleEntite) {
  25 + fprintf(stderr, "Erreur : impossible d'allouer la mémoire pour une nouvelle entité.\n");
  26 + exit(EXIT_FAILURE);
  27 + }
  28 + nouvelleEntite->x = x;
  29 + nouvelleEntite->y = y;
  30 + nouvelleEntite->type = type;
  31 + nouvelleEntite->etat = etat;
  32 + nouvelleEntite->suivante = liste->tete;
  33 + liste->tete = nouvelleEntite;
  34 + printf("Ajouté entité de type %d à (%d, %d)\n", type, x, y);
  35 +}
  36 +
  37 +
  38 +void initEnvahisseurs(listeEntites* liste, int nbEnvahisseurs, int y) {
  39 + for (int i = 0; i < nbEnvahisseurs; i++) {
  40 + ajouterEntite(liste, i * 40, y, 1, 1); // Type 1 pour envahisseur
  41 + }
  42 + printf("Initialisé %d envahisseurs à la position y = %d\n", nbEnvahisseurs, y);
  43 +}
  44 +
  45 +
  46 +void initVaisseau(entite* vaisseau, int x, int y) {
  47 + vaisseau->x = x;
  48 + vaisseau->y = y;
  49 + vaisseau->type = 0;
  50 + vaisseau->etat = 1;
  51 + vaisseau->suivante = NULL;
  52 + printf("Initialisé vaisseau à (%d, %d)\n", x, y);
  53 +}
  54 +
  55 +
  56 +void deplacerEnvahisseurs(listeEntites* envahisseurs, int largeurEcran, int* direction, bool* bordAtteint) {
  57 + entite* courant = envahisseurs->tete;
  58 + while (courant != NULL) {
  59 + courant->x += *direction * 10;
  60 +
  61 +
  62 + if (courant->x <= 0 || courant->x >= largeurEcran - 40) {
  63 + *bordAtteint = true;
  64 + }
  65 +
  66 + courant = courant->suivante;
  67 + }
  68 +
  69 +
  70 + if (*bordAtteint) {
  71 + *direction = -*direction;
  72 + courant = envahisseurs->tete;
  73 + while (courant != NULL) {
  74 + courant->y += 10;
  75 + courant = courant->suivante;
  76 + }
  77 + *bordAtteint = false;
  78 + printf("Les envahisseurs ont changé de direction\n");
  79 + }
  80 +}
  81 +
  82 +
  83 +void gererEntrees(entite* vaisseau, listeEntites* missiles) {
  84 + const Uint8* etatClavier = SDL_GetKeyState(NULL);
  85 +
  86 + if (etatClavier[SDLK_LEFT]) {
  87 + vaisseau->x -= 10;
  88 + }
  89 + if (etatClavier[SDLK_RIGHT]) {
  90 + vaisseau->x += 10;
  91 + }
  92 + if (etatClavier[SDLK_SPACE]) {
  93 +
  94 + ajouterEntite(missiles, vaisseau->x + 20, vaisseau->y - 10, 2, 1);
  95 + printf("Missile tiré à (%d, %d)\n", vaisseau->x + 20, vaisseau->y - 10);
  96 + }
  97 +}
  98 +
  99 +
  100 +bool collision(entite* a, entite* b) {
  101 + return (a->x < b->x + 40 &&
  102 + a->x + 40 > b->x &&
  103 + a->y < b->y + 40 &&
  104 + a->y + 40 > b->y);
  105 +}
  106 +
  107 +entite* collisionAvecListe(entite* ent, listeEntites* liste) {
  108 + entite* courant = liste->tete;
  109 + while (courant != NULL) {
  110 + if (collision(ent, courant)) {
  111 + return courant;
  112 + }
  113 + courant = courant->suivante;
  114 + }
  115 + return NULL;
  116 +}
  117 +
  118 +
  119 +int chargerSprites() {
  120 + vaisseauID = chargerLutin("invader_canon.bmp", 0);
  121 + envahisseurID = chargerLutin("invader_monstre1_1.bmp", 1);
  122 + missileID = chargerLutin("invader_missile.bmp", 2);
  123 + bombeID = chargerLutin("invader_bombe.bmp", 3);
  124 +
  125 + if (vaisseauID < 0) {
  126 + fprintf(stderr, "Erreur : échec du chargement du lutin vaisseau.\n");
  127 + return 0;
  128 + }
  129 + if (envahisseurID < 0) {
  130 + fprintf(stderr, "Erreur : échec du chargement du lutin envahisseur.\n");
  131 + return 0;
  132 + }
  133 + if (missileID < 0) {
  134 + fprintf(stderr, "Erreur : échec du chargement du lutin missile.\n");
  135 + return 0;
  136 + }
  137 + if (bombeID < 0) {
  138 + fprintf(stderr, "Erreur : échec du chargement du lutin bombe.\n");
  139 + return 0;
  140 + }
  141 + printf("Sprites chargés avec succès\n");
  142 + return 1;
  143 +}
  144 +
  145 +
  146 +void afficherEntite(entite* ent) {
  147 + int lutinID;
  148 + switch (ent->type) {
  149 + case 0: lutinID = vaisseauID; break;
  150 + case 1: lutinID = envahisseurID; break;
  151 + case 2: lutinID = missileID; break;
  152 + case 3: lutinID = bombeID; break;
  153 + default:
  154 + fprintf(stderr, "Erreur : type de lutin inconnu %d.\n", ent->type);
  155 + return;
  156 + }
  157 + afficherLutin(lutinID, ent->x, ent->y);
  158 + printf("Affichage de l'entité de type %d à (%d, %d)\n", ent->type, ent->x, ent->y);
  159 +}
  160 +
  161 +
  162 +int main() {
  163 + if (!creerSurface(800, 600, "Space Invaders")) {
  164 + fprintf(stderr, "Erreur lors de la création de la surface graphique.\n");
  165 + return EXIT_FAILURE;
  166 + }
  167 +
  168 + if (!chargerSprites()) {
  169 + fprintf(stderr, "Erreur lors du chargement des sprites.\n");
  170 + fermerSurface();
  171 + return EXIT_FAILURE;
  172 + }
  173 +
  174 + listeEntites envahisseurs;
  175 + listeEntites missiles;
  176 + initListe(&envahisseurs);
  177 + initListe(&missiles);
  178 +
  179 + entite vaisseau;
  180 + initVaisseau(&vaisseau, 380, 550);
  181 +
  182 + initEnvahisseurs(&envahisseurs, 10, 50);
  183 +
  184 + int direction = 1;
  185 + bool bordAtteint = false;
  186 +
  187 +
  188 +
  189 +while(!getchar())
  190 +{
  191 + deplacerEnvahisseurs(&envahisseurs, 800, &direction, &bordAtteint);
  192 + entite* missile = missiles.tete;
  193 + while (missile != NULL) {
  194 + entite* cible = collisionAvecListe(missile, &envahisseurs);
  195 + if (cible != NULL) {
  196 + missile->etat = 0;
  197 + cible->etat = 0;
  198 + printf("Collision détectée entre missile et envahisseur\n");
  199 + }
  200 + missile = missile->suivante;
  201 + }
  202 +
  203 +
  204 +
  205 +
  206 +
  207 +
  208 + entite* courant = envahisseurs.tete;
  209 + while (courant != NULL) {
  210 + if (courant->etat == 1) {
  211 + afficherEntite(courant);
  212 + }
  213 + courant = courant->suivante;
  214 + }
  215 +
  216 + if (vaisseau.etat == 1) {
  217 + afficherEntite(&vaisseau);
  218 + }
  219 +
  220 + missile = missiles.tete;
  221 + while (missile != NULL) {
  222 + if (missile->etat == 1) {
  223 + afficherEntite(missile);
  224 + }
  225 + missile = missile->suivante;
  226 + }
  227 +
  228 + SDL_Flip(surface);
  229 + }
  230 +
  231 + fermerSurface();
  232 + return 0;
  233 +
  234 +
  235 +}
  236 +// calcul de collision entre l'ensemble des missiles et la liste d'entité
  237 +
  238 +
  239 +
  240 +