Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - problema con allegro su code block
Forum - C/C++ - problema con allegro su code block

Avatar
elassia99 (Normal User)
Newbie


Messaggi: 4
Iscritto: 20/11/2016

Segnala al moderatore
Postato alle 18:43
Domenica, 20/11/2016
Da poco mi sto interfacciando ad allegro con il linguaggio c++. Ho creato il mio primo gioco, tutto funziona ma quando vado a compilarlo non riesce ad eseguirmelo. in descrizione vi lascio il messaggio di errore.
La mia versione di windows Home Premium.
Questo è il mio programma:

Codice sorgente - presumibilmente C++

  1. #include <allegro.h>
  2. #include <time.h>   //per il tempo
  3. #include <sstream>
  4. #define largo 1000
  5. #define lunghezza 720
  6. #define limite_nodi 200  //limite di pezzi che può avere il serpente
  7. #define sopra 0
  8. #define giu 1
  9. #define sinistra 2
  10. #define destra 3
  11. //Bitmap trasforma un immagine in formato digitale(pixel)
  12. BITMAP *buffer,  //buffer serve per visualizzare il contenuto su schermo
  13.        *teste,   //4 teste
  14.        *testa,   //testa principale
  15.        *corpo,
  16.        *vita,
  17.        *cibo,
  18.        *muro,
  19.        *fondo,
  20.        *menu1,
  21.        *menu2,
  22.        *cursore;
  23. //le posizioni per muovere
  24. int limite_x=largo/40;
  25. int limite_y=lunghezza/40;
  26. int partenza_nodi=3;   //il serpente parte da 3 nodi + testa[0] =4
  27. int dir=destra; //direzione di partenza è la destra
  28. int cibo_x, cibo_y; //X e Y per la posizione del cibo
  29. int punti=0, vitaa=3; //score iniziale e vite
  30. int muro_x, muro_y;
  31.  
  32. //vettore per i nodi
  33. struct nodo{
  34.              int x,y; //per il corpo
  35.             };
  36. nodo corpi[limite_nodi];
  37.  
  38. void setupt()
  39. {
  40.     allegro_init();
  41.     install_keyboard(); //installa la tastiera
  42.     install_mouse();
  43.     set_color_depth(32);  //qualita colori
  44.     set_gfx_mode(GFX_AUTODETECT,largo,lunghezza,0,0);
  45.     srand(time(NULL));
  46.  
  47.     buffer=create_bitmap(160,40);
  48.     teste=create_bitmap(40,40);
  49.     testa=create_bitmap(40,40);
  50.     corpo=create_bitmap(40,40);
  51.     vita=create_bitmap(40,40);
  52.     cibo=create_bitmap(40,40);
  53.     muro=create_bitmap(40,40);
  54.     fondo=create_bitmap(1000,720);
  55.     menu1=create_bitmap(1000,720);
  56.     menu2=create_bitmap(1000,720);
  57.     cursore=create_bitmap(13,22);
  58.  
  59.     //ASSEGRNAZIONE IMMAGINI
  60.     teste=load_bitmap("imm/testa.bmp" , NULL);  //per parametro nullo
  61.     corpo=load_bitmap("imm/corpo.bmp" , NULL);
  62.     vita=load_bitmap("imm/vita.bmp" , NULL);
  63.     muro=load_bitmap("imm/muro.bmp" , NULL);
  64.     cibo=load_bitmap("imm/cibo.bmp" , NULL);
  65.     fondo=load_bitmap("imm/fondo.bmp" , NULL);
  66.     menu1=load_bitmap("imm/munu1.bmp" , NULL);
  67.     menu2=load_bitmap("imm/meni2.bmp" , NULL);
  68.     cursore=load_bitmap("imm/cursore.bmp" , NULL);
  69. }
  70.  
  71.  
  72. void menuu()
  73. {
  74.   bool x=false;
  75.   while(x=false)
  76.   {   //quando ci ci trova su queste coordinate viene visualizzato il menu 2
  77.       if((mouse_x>370)and(mouse_x<498)and(mouse_y>410)and(mouse_y<590))
  78.       {/* il comando 'blit' prende il contenuto che è stato disegnato nel buffer e lo visualizza su schermo
  79.           partendo da un certo angolo (x1=0,y1=0) fino all'angolo opposto dello schermo (x2=1000, y2=720) */
  80.           blit(menu2,buffer,0,0,0,0,1000,720);
  81.           //Se si preme il pulsante sinistro del mouse, quando viene chiamata la funzione mouse_b , restituisce un 1
  82.           //quando non viene premuto niente restiturisce 0
  83.           if(mouse_b&1) (x=true);
  84.                         else
  85.                         {
  86.                         blit(menu1,buffer,0,0,0,0,1000,720);
  87.                         /*masked_blit salta i pixel trasparenti, che sono contrassegnati da un rosa brillante 0
  88.                         i dati TrueColor (massimo rosso e blu, verde)*/
  89.                         masked_blit(cursore,buffer,0,0,mouse_x,mouse_y,13,22);
  90.                         blit(buffer,screen,0,0,0,0,1000,720);
  91.                         }
  92.  
  93.       }
  94.   }
  95.  
  96. }
  97.  
  98. void aggiornamento()  //per aggiornare dello sfondo, cioè permette di non far finire la partita quando appena l'utente preme start
  99. {
  100.     blit(buffer,screen,0,0,0,0,largo/*1000*/,lunghezza/*720*/);
  101. }
  102.  
  103. //per i muri
  104. void bordi()
  105. {
  106.     //draw_sprite fa una copia della bitmap, nella bitmap di destinazione e rende trasparenti i pixel rosa
  107.     draw_sprite(buffer,fondo,0,40);
  108.     //muro superiore
  109.      for (int muro_x=0;muro_x<26;muro_x++){
  110.                                             muro_y=1;
  111.                                             draw_sprite(buffer,muro,muro_x*40,muro_y*40);
  112.                                           }
  113.     //muro inferiore
  114.      for(int muro_x=0;muro_x<26;muro_x++){
  115.                                            muro_y=17;
  116.                                            draw_sprite(buffer,muro,muro_x*40,muro_x*40);
  117.                                          }
  118.      //muro sinistra veriticale
  119.      for(int muro_y=1;muro_y<18;muro_y++){
  120.                                           muro_x=0;
  121.                                           draw_sprite(buffer,muro,muro_x*40,muro_y*40);
  122.                                          }
  123.      //muro destra verticale
  124.      for(int muro_y=1;muro_y<18;muro_y++){
  125.                                           muro_x=24;
  126.                                           draw_sprite(buffer,muro,muro_x*40,muro_y*40);
  127.                                           }
  128. }
  129.  
  130. void genera() //indica le posizioni
  131. {
  132.     corpi[0].x=10; //per la posizione iniziale
  133.     corpi[0].y=10;
  134.     for(int i=1;i<=partenza_nodi;i++){
  135.                                       corpi[i].x=corpi[0].x-i;
  136.                                       corpi[i].y=corpi[0].y;
  137.                                      }
  138. }
  139.  
  140. void per_cibo()
  141. {    //rand() genera la posizione random di cibo
  142.     cibo_x=(rand()%(limite_x-2))+1; //(25-2) +1
  143.     cibo_y=(rand()%(limite_y-3))+2;
  144. }
  145.  
  146. void disegno_cibo()
  147. {
  148.     draw_sprite(buffer,cibo,cibo_x*40,cibo_y*40);
  149. }
  150.  
  151. void disegno_serpente()
  152. {
  153.     switch(dir){
  154.                 case sopra: blit(teste,testa,0,0,0,0,40,40);
  155.                 case giu:   blit(teste,testa,40,0,0,0,40,40);
  156.                 case destra: blit(teste,testa,80,0,0,0,40,40);
  157.                 case sinistra :blit(teste,testa,120,0,0,0,40,40);
  158.                 }
  159.     draw_sprite(buffer,testa,corpi[0].x*40,corpi[0].y*40);
  160.     //per corpo
  161.     for(int i=1;i<=partenza_nodi;i++)
  162.     {
  163.         draw_sprite(buffer,corpo,corpi[i].x*40,corpi[0].y*40);
  164.     }
  165. }
  166.  
  167. void direzione_attuale()
  168. {
  169.     if(key[KEY_UP]){
  170.                      if(dir!=giu) dir=sopra;  //0
  171.                     }
  172.                      else
  173.                      if(key[KEY_DOWN]){
  174.                                         if (dir!=sopra) dir=giu;  //1
  175.                                         }
  176.                                         else if (key[KEY_RIGHT]){
  177.                                                                 if(dir!=sinistra)  //2
  178.                                                                 dir=destra;
  179.                                                                 }
  180.                                                                 else if(key[KEY_LEFT]){
  181.                                                                                         if(dir!=destra) dir=sinistra;  //3
  182.                                                                                        }
  183. }
  184.  
  185. void perdita_vita()
  186. {
  187.     vitaa--;  //ogni volta che perde una vita
  188.     if (vitaa>0){
  189.                 clear(screen); //pulisce l'intero schermo
  190.                 textout_ex(screen,font,"HAI PERSO UNA VITA",40*10,40*9,0xFFFFFF,0x000000);
  191.                 rest(2000); //per quanto tempo rimane la scritta
  192.                 }
  193.                 else
  194.                 {
  195.                  clear(screen);
  196.                  textout_ex(screen,font,"GAME OVER",40*10,40*9,0xFFFFFF,0x000000);
  197.                  rest(2000);
  198.                  exit(0);
  199.                 }//a questo punto il gioco finisce
  200. }
  201.  
  202. void movimento()
  203. {
  204.     for (int i=partenza_nodi;i>0;i--){
  205.                                       corpi[i]=corpi[i-1];
  206.                                      }
  207.     switch(dir){
  208.                  case sopra: corpi[0].y--;
  209.                  case giu: corpi[0].y++;
  210.                  case destra: corpi[0].x++;
  211.                  case sinistra :corpi[0].x--;
  212.                  }
  213.      //quando tocca cibo
  214.     if ((corpi[0].x==cibo_x)and(corpi[0].y==cibo_y)){
  215.                                                     per_cibo();
  216.                                                     partenza_nodi++;
  217.                                                     corpi[partenza_nodi]=corpi[partenza_nodi-1];//per lampeggiare
  218.                                                     punti=punti+5;
  219.                                                     }
  220.      //quando si scontra con il bordo
  221.      if((corpi[0].x<1)or(corpi[0].x>(limite_x-2))or(corpi[0].y<2)or(corpi[0].y>(limite_y-2)))
  222.                                                                           {
  223.                                                                               perdita_vita();
  224.                                                                               genera();
  225.                                                                               dir=destra;
  226.                                                                           }
  227.       //quando si scontra con il suo stesso corpo
  228.       for(int i=1;9<=partenza_nodi;i++){
  229.                                         if((corpi[0].x==corpi[i].x)and(corpi[0].y==corpi[i].y)){
  230.                                                                                                perdita_vita();
  231.                                                                                               }
  232.                                          }
  233. }
  234.  
  235. void muri()
  236. {
  237.     for(int muro_x=10;muro_x<10;muro_x++){
  238.                                            muro_y=6;
  239.                                            draw_sprite(buffer,muro,muro_x*40,muro_y*40);
  240.                                            if ((corpi[0].x==muro_x)and(corpi[0].y==muro_y)) {perdita_vita();}
  241.                                          }
  242.    for(int muro_x=15;muro_x<19;muro_x++){
  243.                                            muro_y=11;
  244.                                            draw_sprite(buffer,muro,muro_x*40,muro_y*40);
  245.                                            if ((corpi[0].x==muro_x)and(corpi[0].y==muro_y)) {perdita_vita();}
  246.                                          }
  247.    for(int muro_y=6;muro_y<10;muro_x++){
  248.                                            muro_x=15;
  249.                                            draw_sprite(buffer,muro,muro_x*40,muro_y*40);
  250.                                            if ((corpi[0].x==muro_x)and(corpi[0].y==muro_y)) {perdita_vita();}
  251.                                          }
  252.  
  253. }
  254.  
  255. void punteggio()
  256. {
  257.     std::stringstream ss;  //questa classe serve per formattare una stringa in base al punteggio (serve sia per gli input che per gli output
  258.     ss<<"SCORE: "<<punti;
  259.     std::string p=ss.str();
  260.     char point[20];
  261.     strcpy(point,p.c_str());
  262.     textout_ex(buffer,font,point,50,15,0xFFFFFF,0x000000);
  263. }
  264.  void pos_vite()
  265.  {
  266.      textout_ex(buffer,font,"VITE: ",largo-180,14,0xFFFFFF,0x000000);
  267.      for(int i=0;i<vitaa;i++){
  268.                              draw_sprite(buffer,vita,i*40+(largo-120),0);
  269.                             }
  270.  }
  271.  
  272.  int main()
  273.  {
  274.      setupt();
  275.      menuu();
  276.      bordi();
  277.      genera();
  278.      disegno_serpente();
  279.      per_cibo();
  280.      disegno_cibo();
  281.      punteggio();
  282.      muri();
  283.      pos_vite();
  284.      aggiornamento();
  285.      while(!key[KEY_ESC]){
  286.                            clear(buffer);
  287.                            aggiornamento();
  288.                            bordi();
  289.                            muri();
  290.                            disegno_serpente();
  291.                            disegno_cibo();
  292.                            punteggio();
  293.                            pos_vite();
  294.                            aggiornamento();
  295.                            rest(200);
  296.                            }
  297.      readkey(); //per chiudere la finestra
  298.      return 0;
  299.  }
  300.  END_OF_MAIN();



Edit by HeDo: Ricordati di inserire il codice tra tag CODE


elassia99 ha allegato un file: Cattura.PNG (20366 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da HeDo il 21/11/2016 alle 8:19
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:33
Domenica, 20/11/2016
Quello non è un errore, ignoralo.

P.S. Per il codice usa i tag CODE


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
elassia99 (Normal User)
Newbie


Messaggi: 4
Iscritto: 20/11/2016

Segnala al moderatore
Postato alle 10:44
Lunedì, 21/11/2016
Scusa l'ignoranza, cosa sono i tag code???

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 10:46
Lunedì, 21/11/2016
Lo ha fatto il moderatore al posto tuo. Puoi vederlo nel tuo primo post


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
elassia99 (Normal User)
Newbie


Messaggi: 4
Iscritto: 20/11/2016

Segnala al moderatore
Postato alle 12:48
Lunedì, 21/11/2016
A parte questo sai come potrei risolvere il mio problema???Dovrei usare un altro compilatore secondo te?

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5475
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 15:07
Lunedì, 21/11/2016
Ma hai letto quello che ti ho scritto prima?


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
PM Quote
Avatar
AldoBaldo (Member)
Expert


Messaggi: 345
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 15:23
Lunedì, 21/11/2016
Elassia, non sono un esperto di Allegro, però qualche tempo fa ho provato ad usare SDL, che credo abbia alcuni punti in comune. In SDL (magari anche in Allegro), quando inizializzi la libreria richiedi una certa modalità video ("video mode"), il che comprende richieste al sistema di impostare la profondità di colore, la risoluzione dello schermo, e chissà quali e quante altre diavolerie. Quando lasci il programma, la libreria si occupa di ripristinare la modalità video originale.

La finestra che ci hai mostrato, per quel che riesco a capire, mi sembra tanto una finestra di avviso che informa sull'avvenuto cambiamento della modalità video, più specificamente della profondità di colore o comunque della mappatura dei colori. La parte conclusiva del messaggio pare dire che alla fine dell'esecuzione saranno ripristinate le impostazioni originali. Tutto qui. Per questo nessuno, poco sopra, ti faceva notare che non si tratta di un errore.


Ma cosa vuoi che ne sappia? Io ci gioco, col codice, mica ci lavoro!
PM Quote
Avatar
elassia99 (Normal User)
Newbie


Messaggi: 4
Iscritto: 20/11/2016

Segnala al moderatore
Postato alle 17:28
Lunedì, 21/11/2016
Ho capito. E forse ho capito anche qual è il mio problema ed è la funzione draw_sprite, è come se non fosse inclusa nella mia libreria allegro e non so come fare onestamente...

PM Quote