Advertisement
Guest User

Untitled

a guest
Apr 20th, 2019
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.39 KB | None | 0 0
  1. #define NBREVIF 100
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <allegro.h>
  6. #include <time.h>
  7.  
  8.  
  9.  
  10.  
  11. /**********************/
  12. /*     STRUCTURES     */
  13. /**********************/
  14.  
  15. // chaque acteur qui se déplace
  16. typedef struct acteur
  17. {
  18.  
  19.     // position du coin sup. gauche
  20.     int x,y;
  21.  
  22.     // vecteur deplacement
  23.     int dx,dy;
  24.  
  25.     // largeur hauteur
  26.     int tx,ty;
  27.  
  28.     // couleur (ne sera plus pertinent avec des sprites importés...)
  29.     int couleur;
  30.  
  31.     // type (ici 2 types mais on peut en mettre plus):
  32.     //   0 laser
  33.     //   1 missile (accélération horizontale)
  34.     int type;
  35.  
  36.     // comportement :
  37.     //   0 normal déplacement
  38.     //   1 explosion
  39.     int comportement;
  40.     int cptexplo; // temps depuis l'explosion
  41.  
  42.     // vivant :
  43.     //   0 mort (doit disparaitre de la liste)
  44.     //   1 vivant
  45.     int vivant;
  46.  
  47. } t_acteur;
  48.  
  49. // Une collection de acteurs
  50. typedef struct listeActeurs
  51. {
  52.     // nombre maxi d'éléments
  53.     // =taille du tableau de pointeurs
  54.     int max;
  55.  
  56.     // nombre effectif de pointeurs utilisés
  57.     // (les autres sont à NULL)
  58.     int n;
  59.  
  60.     // le tableau de pointeurs (alloué dynamiquement)
  61.     t_acteur **tab;
  62.  
  63. } t_listeActeurs;
  64.  
  65.  
  66. // Spécifique à cet exemple : un vaisseau et une cible
  67.  
  68. // Un élément à déplacement interactif
  69. typedef struct joueur{
  70.     int x,y;     // position
  71.     int tx,ty;   // taille
  72.     int vit;     // vitesse des déplacements (nombre de pixels)
  73.     int cpttir0; // tempo armement 0
  74.     int cpttir1; // tempo armement 1
  75.     BITMAP *img; // sprite (image chargée)
  76. } t_joueur;
  77.  
  78. // Un élément à déplacement automatique aléatoire
  79. typedef struct ennemi{
  80.     int x,y;     // position
  81.     int dx,dy;   // vecteur déplacement
  82.     int tx,ty;   // taille
  83.     BITMAP *img; // sprite (image chargée)
  84. } t_ennemi;
  85.  
  86. typedef struct vif{
  87.     int x,y;     // position
  88.     int dx,dy;   // vecteur déplacement
  89.     int tx,ty;   // taille
  90.     BITMAP *img; // sprite (image chargée)
  91. } t_vif;
  92.  
  93.  
  94. /*********************/
  95. /*     PROTOTYPES    */
  96. /*********************/
  97.  
  98. // Allouer et initialiser un acteur
  99. // pour ce projet il faut x y de départ et type
  100. //   ( à adapter selon besoins )
  101. t_acteur * creerActeur(int x,int y,int type);
  102.  
  103. // Allouer et initialiser une liste (vide) de acteurs
  104. t_listeActeurs * creerListeActeurs(int maxacteurs);
  105.  
  106. // Retourne un booléen vrai si il reste de la place
  107. // dans la liste, faux sinon
  108. int libreListeActeurs(t_listeActeurs *la);
  109.  
  110. // Allouer et ajouter un acteur à la liste
  111. // et retourner l'adresse de ce nouveau acteur
  112. // retourne NULL en cas de problème
  113. // pour ce projet il faut x y de départ et type
  114. //   ( à adapter selon besoins )
  115. t_acteur * ajouterActeur(t_listeActeurs *la,int x,int y,int type);
  116.  
  117. // Enlever et libèrer un acteur qui était dans la liste en indice i
  118. void enleverActeur(t_listeActeurs *la,int i);
  119.  
  120.  
  121.  
  122. // Actualiser un acteur (bouger ...)
  123. void actualiserActeur(t_acteur *acteur);
  124.  
  125. // Gérer l'évolution de l'ensemble des acteurs
  126. void actualiserListeActeurs(t_listeActeurs *la);
  127.  
  128.  
  129. // Dessiner un acteur sur la bitmap bmp
  130. void dessinerActeur(BITMAP *bmp,t_acteur *acteur);
  131.  
  132. // Dessiner sur une bitmap l'ensemble des acteurs
  133. void dessinerListeActeurs(BITMAP *bmp,t_listeActeurs *la);
  134.  
  135.  
  136. // Un acteur a été touché ou a touché une cible : modifier son état
  137. // ici on indique qu'il passe en comportement 1 (explosion)
  138. // et le vecteur vitesse est divisé en norme (ralentissement)
  139. void destinActeur(t_acteur *acteur);
  140.  
  141. // Gérer collision (éventuelle) entre un acteur (un tir) et un ennemi
  142. void collisionActeur(t_ennemi *ennemi,t_acteur *acteur);
  143.  
  144. // Gérer les collisions entre les acteurs (tous les tirs) et un ennemi
  145. void collisionListeActeurs(t_ennemi *ennemi,t_listeActeurs *la);
  146.  
  147.  
  148. // Spécifique à cet exemple : gérer le vaisseau et la cible
  149.  
  150. // Allouer et initialiser joueur
  151. t_joueur * creerJoueur(char *nomimage);
  152.  
  153. // Actualiser joueur (bouger interactivement et tirer...)
  154. void actualiserJoueur(t_joueur *joueur,t_listeActeurs *la);
  155.  
  156. // Dessiner joueur sur la bitmap bmp
  157. void dessinerJoueur(BITMAP *bmp,t_joueur *joueur);
  158.  
  159.  
  160. // Allouer et initialiser ennemi
  161. t_ennemi * creerEnnemi(char *nomimage);
  162.  
  163. t_vif * creerVif(char *nomimage);
  164.  
  165.  
  166. // Actualiser ennemi (bouger automatiquement au hasard...)
  167. void actualiserEnnemi(t_ennemi *ennemi);
  168.  
  169. void actualiserVif(t_vif *vif);
  170. // Dessiner ennemi sur la bitmap bmp
  171. void dessinerEnnemi(BITMAP *bmp,t_ennemi *ennemi);
  172. void dessinerVif(BITMAP *bmp,t_vif *vif);
  173.  
  174. int main()
  175. {
  176. struct ennemi*ennemi[20];
  177. struct vif*vif[5];
  178.     // Buffer
  179.     BITMAP *page;
  180.  
  181.     // Image de fond
  182.     BITMAP *decor;
  183.  
  184.     BITMAP *badvif;
  185.  
  186.     BITMAP *bonvif;
  187.  
  188.     BITMAP *regle;
  189.  
  190.     BITMAP *pause;
  191.  
  192.     BITMAP *arriere;
  193.  
  194.     BITMAP *vie;
  195.  
  196.     // La collection des acteurs (les tirs)
  197.     t_listeActeurs *acteurs;
  198.  
  199.     // Le vaisseau manipulé par le joueur
  200.     t_joueur *vaisseau;
  201.  
  202.     // La cible qui se déplace automatiquement
  203.     //t_ennemi *cible;
  204.  
  205.     // Il y aura du hasard
  206.     srand(time(NULL));
  207.  
  208.     // Lancer allegro et le mode graphique
  209.     allegro_init();
  210.     install_keyboard();
  211.      install_mouse();
  212.  
  213.     set_color_depth(desktop_color_depth());
  214.     if (set_gfx_mode(GFX_AUTODETECT_WINDOWED,1300,700,0,0)!=0)
  215.     {
  216.         allegro_message("prb gfx mode");
  217.         allegro_exit();
  218.         exit(EXIT_FAILURE);
  219.     }
  220.  
  221.     // buffer
  222.     page=create_bitmap(SCREEN_W,SCREEN_H);
  223.  
  224.     // charger image de fond
  225.     decor=load_bitmap("fond.bmp",NULL);
  226.     badvif=load_bitmap("vif2.bmp",NULL);
  227.     bonvif=load_bitmap("vif.bmp",NULL);
  228.     regle=load_bitmap("regle.bmp",NULL);
  229.     pause=load_bitmap("pause.bmp",NULL);
  230.     vie=load_bitmap("vie6.bmp",NULL);
  231.  
  232.     if (!decor)
  233.     {
  234.         allegro_message("pas pu trouver le fond.bmp");
  235.         exit(EXIT_FAILURE);
  236.     }
  237.  
  238.     // créer le vaisseau et la cible
  239. //    vaisseau=creerJoueur("bonharry.bmp");
  240.  
  241.  
  242.  
  243.     // préparer la liste des acteurs (100 maxi)
  244.     // mais vide initialement
  245. //    acteurs=creerListeActeurs(100);
  246. int i;
  247. int jeu=0;
  248. int depart=0;
  249.     t_ennemi * cible [NBREVIF];
  250.  
  251.     for( i = 0;i<NBREVIF;i++)
  252.     {
  253.         cible[i] = creerEnnemi("vif2.bmp");
  254.  
  255.     }
  256.  
  257.      t_vif * cible1 [5];
  258.  
  259.     for( i = 0;i<5;i++)
  260.     {
  261.         cible1[i] = creerVif("vif.bmp");
  262.     }
  263.     show_mouse(screen);
  264.     // BOUCLE DE JEU
  265.     while (!key[KEY_ESC])
  266.     {
  267.         blit(regle,page,0,0,0,0,SCREEN_W,SCREEN_H);
  268.         blit(page,screen,0,0,0,0,SCREEN_W,SCREEN_H);
  269.         if (key[KEY_ENTER])
  270.         {
  271.             //clear_bitmap(page);
  272.  
  273.            regle=decor;
  274.            depart=1;
  275.         }
  276.         if (depart==1)
  277.         {
  278.             masked_blit(vie,page,0,0,0,0,SCREEN_W,SCREEN_H);
  279.             blit(page,screen,0,0,0,0,SCREEN_W,SCREEN_H);
  280.             if (key[KEY_P])
  281.             {
  282.                 jeu=1;
  283.  
  284.             }
  285.             if (jeu==1)
  286.             {
  287.                 masked_blit(pause,page,0,0,0,0,SCREEN_W,SCREEN_H);
  288.                 blit(page,screen,0,0,0,0,SCREEN_W,SCREEN_H);
  289.             }
  290.             if (key[KEY_O])
  291.             {
  292.                 jeu=0;
  293.             }
  294.  
  295.             if (jeu==0)
  296.             {
  297.  
  298.             if ( mouse_b&1)
  299.  
  300.             {
  301.                 printf("test : %d\n %d\n",getpixel(page,mouse_x,mouse_y),makecol(0,0,0));
  302.                 if (getpixel(page,mouse_x,mouse_y)==656652)
  303.                 {
  304.                     //textprintf_ex(screen,font,4,6,makecol(255,0,0),makecol(0,255,0),"EXIT");
  305.                     printf("ok");
  306.  
  307.                 }
  308.             }
  309.  
  310.         // effacer buffer en appliquant décor  (pas de clear_bitmap)
  311.         //blit(decor,page,0,0,0,0,SCREEN_W,SCREEN_H);
  312.  
  313.         // bouger tout le monde
  314.         //actualiserJoueur(vaisseau,acteurs);
  315.         for(i=0;i<NBREVIF;i++)
  316.         {
  317.             actualiserEnnemi(cible[i]);
  318.             dessinerEnnemi(page,cible[i]);
  319.         }
  320.  
  321.          for(i=0;i<5;i++)
  322.         {
  323.             actualiserVif(cible1[i]);
  324.             //actualisercercle
  325.             //dessinercerclesurbuffer
  326.             dessinerVif(page,cible1[i]);
  327.         }
  328.  
  329. //        actualiserListeActeurs(acteurs);
  330.  
  331.         // gérer les collisions
  332. ///        collisionListeActeurs(cible,acteurs);
  333.  
  334.         // afficher tout le monde
  335. ///        dessinerJoueur(page,vaisseau);
  336. ///
  337.  
  338.    ///     dessinerListeActeurs(page,acteurs);
  339.  
  340.         // afficher tout ça à l'écran
  341.         blit(page,screen,0,0,0,0,SCREEN_W,SCREEN_H);
  342.  
  343.         // petite temporisation
  344.         rest(10);
  345.     }}}
  346.  
  347.     return 0;
  348. }
  349. END_OF_MAIN();
  350.  
  351.  
  352. // Dessiner ennemi sur la bitmap bmp
  353. void dessinerEnnemi(BITMAP *bmp,t_ennemi *ennemi){
  354.     draw_sprite(bmp,ennemi->img,ennemi->x,ennemi->y);
  355. }
  356.  
  357. void dessinerVif(BITMAP *bmp,t_vif *vif){
  358.     draw_sprite(bmp,vif->img,vif->x,vif->y);
  359. }
  360.  
  361. // Allouer et initialiser ennemi
  362. t_ennemi * creerEnnemi(char *nomimage){
  363.     t_ennemi *nouv;
  364.  
  365.     // Allouer
  366.     nouv = (t_ennemi *)malloc(1*sizeof(t_ennemi));
  367.  
  368.     // Initialiser
  369.  
  370.     nouv->img=load_bitmap(nomimage,NULL);
  371.     if (!nouv->img)
  372.     {
  373.         allegro_message("pas pu trouver %s",nomimage);
  374.         exit(EXIT_FAILURE);
  375.     }
  376.  
  377.     nouv->tx = nouv->img->w;
  378.     nouv->ty = nouv->img->h;
  379.  
  380.     nouv->x = SCREEN_W/2-nouv->tx;
  381.     nouv->y = SCREEN_H/2-nouv->ty;
  382.     nouv->dx=0;
  383.     nouv->dy=0;
  384.  
  385.     return nouv;
  386. }
  387.  
  388. t_vif * creerVif(char *nomimage){
  389.     t_vif *nouv;
  390.  
  391.     // Allouer
  392.     nouv = (t_vif *)malloc(1*sizeof(t_vif));
  393.  
  394.     // Initialiser
  395.  
  396.     nouv->img=load_bitmap(nomimage,NULL);
  397.     if (!nouv->img)
  398.     {
  399.         allegro_message("pas pu trouver %s",nomimage);
  400.         exit(EXIT_FAILURE);
  401.     }
  402.  
  403.     nouv->tx = nouv->img->w;
  404.     nouv->ty = nouv->img->h;
  405.  
  406.     nouv->x = SCREEN_W/2-nouv->tx;
  407.     nouv->y = SCREEN_H/2-nouv->ty;
  408.     nouv->dx=0;
  409.     nouv->dy=0;
  410.  
  411.     return nouv;
  412. }
  413.  
  414. // Actualiser ennemi
  415. // (bouger automatiquement au hasard dans la moitié droite...)
  416. void actualiserEnnemi(t_ennemi *ennemi){
  417.  
  418.     // proba de changement de déplacement : une chance sur 20
  419.     if ( rand()%20==0 ){
  420.         // Nouveau vecteur déplacement
  421.         ennemi->dx = rand()%11-5;
  422.         ennemi->dy = rand()%11-5;
  423.     }
  424.  
  425.     // contrôle des bords : ici on décide de rebondir sur les bords
  426.     if  (  ( ennemi->x < 0 && ennemi->dx < 0 ) ||
  427.            ( ennemi->x + ennemi->tx > SCREEN_W && ennemi->dx > 0) )
  428.         ennemi->dx = -ennemi->dx;
  429.  
  430.     if  (  ( ennemi->y < 0 && ennemi->dy < 0 ) ||
  431.            ( ennemi->y + ennemi->ty > SCREEN_H && ennemi->dy > 0) )
  432.         ennemi->dy = -ennemi->dy;
  433.  
  434.     // calculer nouvelle position
  435.     // nouvelle position = position actuelle + deplacement
  436.     ennemi->x = ennemi->x + ennemi->dx;
  437.     ennemi->y = ennemi->y + ennemi->dy;
  438.  
  439. }
  440.  
  441.  
  442. void actualiserVif(t_vif *vif){
  443.  
  444.     // proba de changement de déplacement : une chance sur 20
  445.     if ( rand()%20==0 ){
  446.         // Nouveau vecteur déplacement
  447.         vif->dx = rand()%11-5;
  448.         vif->dy = rand()%11-5;
  449.     }
  450.  
  451.     // contrôle des bords : ici on décide de rebondir sur les bords
  452.     if  (  ( vif->x < 0 && vif->dx < 0 ) ||
  453.            ( vif->x + vif->tx > SCREEN_W && vif->dx > 0) )
  454.         vif->dx = -vif->dx;
  455.  
  456.     if  (  ( vif->y < 0 && vif->dy < 0 ) ||
  457.            ( vif->y + vif->ty > SCREEN_H && vif->dy > 0) )
  458.         vif->dy = -vif->dy;
  459.  
  460.     // calculer nouvelle position
  461.     // nouvelle position = position actuelle + deplacement
  462.     vif->x = vif->x + vif->dx;
  463.     vif->y = vif->y + vif->dy;
  464.  
  465. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement