Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Allegro5_Scroll - Allegro5 installazione e primo programma

Allegro5_Scroll

Sommario | Admin | Forum | Bugs | Todo | Files

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 14:37
Mercoledì, 12/04/2023
Non sono un programmatore C ma ho voluto condividere il percorso che ho intrapreso per far funzionare Allegro5 in CODE::BLOCK, sotto Win10 32/64bit.

        ***************** PASSO PASSO *****************

           ALLEGRO_5, CODE::BLOCKS, MinGW, Win10_32/64bit

        ***********************************************


Scaricare: 'allegro-x86_64-w64-mingw32-gcc-12.1.0-posix-seh-static-5.2.8.0.zip' (64bit)
oppure: 'allegro-i686-w64-mingw32-gcc-12.1.0-posix-dwarf-static-5.2.8.0.zip' (32bit)
dal sito: https://github.com/liballeg/allegro5/releases
scorrere la pagina in basso fino ad Assets, lo zip indicato contiene sia le librerie statiche che quelle dinamiche.

Scompattare in C:\
avremo: C:\allegro
             C:\allegro\bin
             C:\allegro\include
             C:\allegro\lib

altre versioni qui: https://www.allegro.cc/files/ (non necessarie)

Su CODE::BLOCKS impostare:
Setting/Compiler/Linker setting... Link libraries/ADD scegliere il file:   'C:\allegro\lib\liballegro_monolith-debug.dll.a'
Setting/Compiler/Searcing directory/Compiler/ADD... scegliere la cartella: 'C:\allegro\include'
Setting/Compiler/Searcing directory/Linker/ADD... scegliere la cartella:   'C:\allegro\bin'

Allegro è pronto per funzionare.
Allegro funzionerà sempre se si da Run da CODE::BLOCK
Per far funzionare i programmi, lanciando gli esegibili creati in DEBUG/RELEASE impostare le variabili d'ambiente:
Win10, clic su lente d'ingrandimento: variabili d'ambiente, appare Modifica le variabili d'ambiente
scegliere il bottone in basso a destra [Variabili d'ambiente]
su Variabili d'ambiente dell'utente cliccare la riga Path e poi [modifica]
aggiungere se non c'è: C:\Program Files\CodeBlocks\MinGW\bin\ (adattalo al tuo percorso MinGW)
aggiungere se non c'è: C:\allegro\bin

I programmi compilati con MinGW e allegro funzioneranno sempre sul tuo PC

Per far funzionare i programmi compilati, con MinGW e allegro, su PC sprovvisti
settare su CODE::BLOCK
Setting/Compiler Flags, spuntare: Static Linking [-static] (incorpora le librerie, il .exe diventa più gande)
Copiare 'C:\allegro\bin\allegro_monolith-debug-5.2.dll' nella cartella dell'eseguibile.

Per far funzionare l'eseguibile a 32bit presente in release anche se non si è installato nulla, andare su: https://github.com/liballeg/allegro5/releases
scorrere la pagina in basso fino ad Assets, scaricare lo zip: 'allegro-i686-w64-mingw32-gcc-12.1.0-posix-dwarf-static-5.2.8.0.zip'
scompattare e dalla cartella: ...\allegro\bin trovare e copiare:
allegro_monolith-debug-5.2.dll nella cartella release che contiene l'eseguibile: Allegro5_scroll.exe

Naturalmente non si possono mescolare le dll di MinGw e quelle di Allegro5 tra 32 e 64 bit

Considerazioni anche banali sul primo codice realizzato e publicato Allegro5_Scroll: http://www.pierotofy.it/pages/projects/files.php?id=722:

Se in C/C++ da codice si carica un file ma viene omesso il percorso, il file viene cercato nella cartella del progetto di CODE::BLOCK solo se si clicca il Run da CODE::BLOCK, invece il file viene cercato nella cartella dell'eseguibile se vine lanciato il .exe
Il codice controlla ogni passo dell'inizializzazione, tutti i controlli possono essere omessi quando non si è più in test.
Disegno lo sfondo le immagini e lo scroll in sequenza ragionata per ottenere i livelli di profondità (asse Z)
Il carro armato in primo piano è composto da tre immagini che generano il movimento delle ruote e dei cingoli.


Carlo ha allegato un file: allegro5.jpg (117166 bytes)
Clicca qui per guardare l'immagine

Ultima modifica effettuata da Carlo il 23/05/2023 alle 16:28


in programmazione tutto è permesso
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 21:21
Mercoledì, 12/04/2023
Molto utile, quasi un tutorial passo-passo.
Tempo fa provai qualcosa di simile con SDL2 (che, se non erro, è alla base di Allegro). Funzionava tutto a dovere, ma per qualche ragione non mi dava soddisfazione far riferimento a una libreria di quel tipo e lasciai perdere.
Se procederai con le esperienze con Allegro leggerò molto volentieri le tue osservazioni - magari mi invoglierai a riprendere a mia volta.


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 0:40
Giovedì, 13/04/2023
Ho condiviso perché tra Allegro4, Allegro5, 32bit, 64bit, win, linux, macos, CODE::BLOCK ecc. ecc. è facile perdere la pazienza e rinunciare. Per me lo scoglio principale è stato trovare i files e le giuste configurazioni per fare in modo che su CODE::BLOCK inseriti gli #include con RUN il codice si compili istantaneamente e vada in esecuzione.

Allegro5 è produttivo, sul sito: https://liballeg.org/a5docs/trunk/ c'è il manuale di riferimento e non ho trovato problemi a realizzare il primo programmino. Ho già visto la gestione del mouse e della tastiera che funzionano creando una coda di eventi esplorabili nel cilo di gioco.

Seconda nota positiva la velocità, se proverai il codice proposto vedrai che remmando l'istruzione: al_rest(0.006); // attesa in secondi potrai saggiare a quale velocità si può arrivare, nel mio portatile il carro armato attraversa lo schermo in 0,5 secondi. Per paragone ho fatto lo stesso ciclo con le stesse grafiche in C# GDI+, il carro armato alla massima velocità possibile impiega 16 secondi ad attraversare lo schermo. Differenza: Allegro5 è 32 volte più veloce.

per eseguire il programma compilato, presente nella cartella release, se non si ha Allegro5 e/o MinGW bisogna aggiungere tre dll:
2 da MinGW allegate nello zip:
libgcc_s_seh-1.dll 64bit
libwinpthread-1.dll 64bit
una dal sito: https://github.com/liballeg/allegro5/releases
scorrere la pagina in basso fino ad Assets, scaricare lo zip: 'allegro-x86_64-w64-mingw32-gcc-12.1.0-posix-seh-static-5.2.8.0.zip' e nella cartella: \allegro\bin  trovare e copiare:
allegro_monolith-debug-5.2.dll


Carlo ha allegato un file: DLLs.zip (60381 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 16/05/2023 alle 17:54


in programmazione tutto è permesso
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 0:55
Giovedì, 13/04/2023
Hai ragione, GDI+ dal punto di vista della velocità fa pena. Inoltre non permette di evitare in alcun modo l'odioso "effetto strappo" ("tearing effect") che si verifica quando il ritracciamento delle immagini a schermo non è sincronizzato con il cosidetto "vertical blank". Aggiungiamo pure che anche solo ottenere una velocità di scorrimento regolare nel ciclo principale senza ricorrere a marchingegni cervellotici e timer più o meno bizzosi è un'impresa titanica, in windows, GDI+ o non GDI+...

In effetti librerie come Allegro (o SDL) permettono di aggirare tutti questi ostacoli, probabilmente perché li fase cervellotiche se le sono cuccate tutte gli sviluppatori, evidentemente capaci a fare il loro mestiere.


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 1:25
Giovedì, 13/04/2023
Testo quotato

Postato originariamente da AldoBaldo:
Hai ragione, GDI+ dal punto di vista della velocità fa pena. Inoltre non permette di evitare in alcun modo l'odioso "effetto strappo" ("tearing effect") che si verifica quando il ritracciamento delle immagini a schermo non è sincronizzato con il cosidetto "vertical blank".

per la velocità hai ragione, il "tearing effect" è stato eliminato con il doppio buffer che swappa i due layer al vertical blank.
Testo quotato


In effetti librerie come Allegro (o SDL) permettono di aggirare tutti questi ostacoli, probabilmente perché li fase cervellotiche se le sono cuccate tutte gli sviluppatori, evidentemente capaci a fare il loro mestiere.


Non sono sicuro ma la differenza dovrebbe essere che GDI+ usa directshow tutto a carico della CPU mentre Allegro le DirectX o OpenGL tutto a carico delle GPUs. Correggetemi se sbaglio.

Ultima modifica effettuata da Carlo il 13/04/2023 alle 1:27


in programmazione tutto è permesso
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 18:50
Giovedì, 13/04/2023
Per provare ho implementato la gestione della tastiera e del mouse.
Con freccia Dx/Sx si incrementa/decrementa la velocità del carro, notare che a velocità zero le ruote si fermano e a velocità negativa vanno indietro.
Con freccia Su/Giù si incrementa/decrementa di 1 millisecondo il ritardo.
Con Spazio si visualizza/nasconde il Sole (viene disegnato sullo sfondo in modo permanente usando un buffer)
Con il tasto sinistro del mouse si disegnano dei trattini sullo scroll
Con il tasto destro del mouse si ripristina lo scroll ed i trattini scompaiono.
A schermo stampata una stringa che contiene velocità e ritardo.
Non pubblico una nuova versione ma posto il codice qui con risorse allegate:
Codice sorgente - presumibilmente C++

  1. #include <allegro5/allegro.h>
  2. #include <allegro5/allegro_image.h>
  3. #include <allegro5/allegro_audio.h>
  4. #include <allegro5/allegro_acodec.h>
  5. #include <allegro5/allegro_font.h>
  6. #include <allegro5/allegro_ttf.h>
  7. #include <allegro5/allegro_primitives.h>
  8. #include <stdio.h>
  9.  
  10. const int WIDTH = 1000;
  11. const int HEIGHT = 500;
  12. // nomi risorse
  13. ALLEGRO_DISPLAY *display = NULL;
  14. ALLEGRO_BITMAP *sprite1 = NULL;
  15. ALLEGRO_BITMAP *sprite2 = NULL;
  16. ALLEGRO_BITMAP *sprite3_a = NULL;
  17. ALLEGRO_BITMAP *sprite3_b = NULL;
  18. ALLEGRO_BITMAP *sprite3_c = NULL;
  19. ALLEGRO_BITMAP *sprite4 = NULL;
  20. ALLEGRO_BITMAP *background = NULL;
  21. ALLEGRO_BITMAP *scroll = NULL;
  22. ALLEGRO_SAMPLE *music = NULL;
  23. ALLEGRO_EVENT_QUEUE *event_queue = NULL;
  24. ALLEGRO_FONT *font = NULL;
  25.  
  26. void destroy() {
  27.     // distrugge la risorsa se caricata
  28.     if (event_queue) al_destroy_event_queue(event_queue);
  29.     if (music) al_destroy_sample(music);
  30.     if (music) al_uninstall_keyboard();
  31.     if (sprite1) al_destroy_bitmap(sprite1);
  32.     if (sprite2) al_destroy_bitmap(sprite2);
  33.     if (sprite3_a) al_destroy_bitmap(sprite3_a);
  34.     if (sprite3_b) al_destroy_bitmap(sprite3_b);
  35.     if (sprite3_c) al_destroy_bitmap(sprite3_c);
  36.     if (sprite4) al_destroy_bitmap(sprite4);
  37.     if (background) al_destroy_bitmap(background);
  38.     if (font) al_destroy_font(font);
  39.     if (scroll) al_destroy_bitmap(scroll);
  40.     if (display) al_destroy_display(display);
  41. }
  42.  
  43. int main(int argc, char* argv[]) {
  44.  
  45.     char c;
  46.     printf("%s\n\n", argv[0]);
  47.     printf("Run da CODE::BLOCK, le risorse devono esistere nella cartella del progetto xxx.cbp\n");
  48.     printf("se lanciato dall'eseguibile le risorse devono esistere nella cartella dell'eseguibile.\n\n");
  49.     printf("Il programma funzionera' in computer che non hanno MinGW e allegro5 se alla compilazione\n");
  50.     printf("si aggiunge -satic (incorpora lib MinGW) e si e' copiato 'allegro_monolith-debug-5.2.dll'\n");
  51.     printf("dalla cartella allegro\\bin nella cartella dell'eseguibile.\n\n");
  52.  
  53.     if (!al_init()) {
  54.         destroy();
  55.         printf("Errore durante l'inizializzazione di Allegro.\nPremi invio");
  56.         scanf("%c", &c);
  57.         return -1;
  58.     }
  59.     if (!al_init_image_addon()) {
  60.         destroy();
  61.         printf("Errore durante l'inizializzazione di image_addon.\nPremi invio");
  62.         scanf("%c", &c);
  63.         return -1;
  64.     }
  65.     display = al_create_display(WIDTH, HEIGHT);
  66.     if (!display) {
  67.         destroy();
  68.         printf("Errore durante la creazione di create_display.\nPremi invio");
  69.         scanf("%c", &c);
  70.         return -1;
  71.     }
  72.     if (!al_install_audio()) {
  73.         destroy();
  74.         printf("Errore durante l'inizializzazione di install_audio.\nPremi invio");
  75.         scanf("%c", &c);
  76.         return -1;
  77.     }
  78.     if (!al_init_acodec_addon()) {
  79.         destroy();
  80.         printf("Errore durante l'inizializzazione di acodec_addon.\nPremi invio");
  81.         scanf("%c", &c);
  82.         return -1;
  83.     }
  84.     if (!al_install_keyboard()) {
  85.         destroy();
  86.         printf("Errore durante l'inizializzazione di install_keyboard.\nPremi invio");
  87.         scanf("%c", &c);
  88.         return -1;
  89.     }
  90.     if (!al_init_ttf_addon()) {
  91.         destroy();
  92.         printf("Errore durante l'inizializzazione di ttf_addon.\nPremi invio");
  93.         scanf("%c", &c);
  94.         return -1;
  95.     }
  96.     if (!al_init_font_addon()) {
  97.         destroy();
  98.         printf("Errore durante l'inizializzazione di font_addon.\nPremi invio");
  99.         scanf("%c", &c);
  100.         return -1;
  101.     }
  102.     sprite1 = al_load_bitmap("Helicopter.png");
  103.     if (!sprite1) {
  104.         destroy();
  105.         printf("Errore durante il caricamento di Helicopter.png.\nPremi invio");
  106.         scanf("%c", &c);
  107.         return -1;
  108.     }
  109.     sprite2 = al_load_bitmap("Helicopter2.png");
  110.     if (!sprite2) {
  111.         destroy();
  112.         printf("Errore durante il caricamento di Helicopter2.png.\nPremi invio");
  113.         scanf("%c", &c);
  114.         return -1;
  115.     }
  116.     sprite3_a = al_load_bitmap("carro1_a.png");
  117.     if (!sprite3_a) {
  118.         destroy();
  119.         printf("Errore durante il caricamento del carro1_a.png.\nPremi invio");
  120.         scanf("%c", &c);
  121.         return -1;
  122.     }
  123.     sprite3_b = al_load_bitmap("carro1_b.png");
  124.     if (!sprite3_b) {
  125.         destroy();
  126.         printf("Errore durante il caricamento del carro1_b.png.\nPremi invio");
  127.         scanf("%c", &c);
  128.         return -1;
  129.     }
  130.     sprite3_c = al_load_bitmap("carro1_c.png");
  131.     if (!sprite3_c) {
  132.         destroy();
  133.         printf("Errore durante il caricamento del carro1_c.png.\nPremi invio");
  134.         scanf("%c", &c);
  135.         return -1;
  136.     }
  137.     sprite4 = al_load_bitmap("carro2.png");
  138.     if (!sprite4) {
  139.         destroy();
  140.         printf("Errore durante il caricamento del carro2.png.\nPremi invio");
  141.         scanf("%c", &c);
  142.         return -1;
  143.     }
  144.     background = al_load_bitmap("sfondo.jpg");
  145.     if (!background) {
  146.         destroy();
  147.         printf("Errore durante il caricamento dello sfondo.jpg.\nPremi invio");
  148.         scanf("%c", &c);
  149.         return -1;
  150.     }
  151.     scroll = al_load_bitmap("scroll3.png");
  152.     if (!scroll) {
  153.         destroy();
  154.         printf("Errore durante il caricamento dell'immagine scroll3.png.\nPremi invio");
  155.         scanf("%c", &c);
  156.         return -1;
  157.     }
  158.     font = al_load_font("c:/Windows/Fonts/arial.ttf", 24, 0);
  159.     if (!font) {
  160.         destroy();
  161.         printf("Errore durante il caricamento di c:/Windows/Fonts/arial.ttf.\nPremi invio");
  162.         scanf("%c", &c);
  163.         return -1;
  164.     }
  165.  
  166.     music = al_load_sample("Katy.ogg");
  167.     if (!music) {
  168.         destroy();
  169.         printf("Errore durante il caricamento del file audio Katy.ogg.\nPremi invio");
  170.         scanf("%c", &c);
  171.         return -1;
  172.     }
  173.     if (!al_reserve_samples(1)) {
  174.         destroy();
  175.         printf("Errore durante l'assegnazione del flusso audio 1.\nPremi invio");
  176.         scanf("%c", &c);
  177.         return -1;
  178.     }
  179.     event_queue = al_create_event_queue();
  180.     if (!event_queue) {
  181.         destroy();
  182.         printf("Errore durante la creazione di create_event_queue.\nPremi invio");
  183.         scanf("%c", &c);
  184.         return -1;
  185.     }
  186.     printf("Allegro5 inizializzato, tutte le risorse caricate.\n");
  187.  
  188.     al_init_primitives_addon();
  189.     al_install_mouse(); // installing mouse
  190.  
  191.     al_register_event_source(event_queue, al_get_display_event_source(display)); // eventi schermo
  192.     al_register_event_source(event_queue, al_get_keyboard_event_source()); // eventi tastiera
  193.     al_register_event_source(event_queue, al_get_mouse_event_source()); // eventi mouse
  194.     al_set_window_title(display, "la sequenza di disegno determina chi copre cosa.  USA LE FRECCE, SPAZIO e MOUSE!");
  195.     al_play_sample(music, 1.0, 0.0, 1.0, ALLEGRO_PLAYMODE_LOOP, NULL);
  196.     ALLEGRO_MOUSE_STATE mouse_state;
  197.  
  198.     int x = -100;
  199.     int scroll_x = 0;
  200.     int anim = 0;
  201.     float velCarro1 = 0;
  202.     float xCarro1 = 50;
  203.     float rest = 0.006;
  204.     bool game_over = false;
  205.     bool sun = false;
  206.     char *sStamp[40] = {0};
  207.     char *sRit[5] = {0};;
  208.     // Buffer sporcabile
  209.     ALLEGRO_BITMAP *bufferSfondo = al_create_bitmap(al_get_bitmap_width(background), al_get_bitmap_height(background));
  210.     // Buffer sporcabile
  211.     ALLEGRO_BITMAP *bufferScroll = al_create_bitmap(al_get_bitmap_width(scroll), al_get_bitmap_height(scroll));
  212.     al_set_target_bitmap(bufferSfondo); // imposto la destinazione dei comandi grafici sul bufferSfondo
  213.     al_draw_bitmap(background, 0, 0, 0); // copio background su bufferSfondo
  214.     al_set_target_bitmap(bufferScroll); // imposto la destinazione dei comandi grafici sul bufferScroll
  215.     al_draw_bitmap(scroll, 0, 0, 0); // copio scroll su bufferScroll
  216.     al_set_target_backbuffer(display); // ripristino la destinazione della grafica sul display
  217.  
  218.     // Ciclo della finestra
  219.     while (!game_over) {
  220.  
  221.         ALLEGRO_EVENT event; // coda degli eventi
  222.         bool got_event = al_get_next_event(event_queue, &event);
  223.  
  224.         // controllo eventi se ci sono
  225.         if (got_event && event.type == ALLEGRO_EVENT_DISPLAY_CLOSE)
  226.             game_over = true;
  227.         else { // controllo eventi tastiera/mouse
  228.             if (event.type == ALLEGRO_EVENT_KEY_DOWN) {
  229.                 // printf("Kc:%d ", event.keyboard.keycode);
  230.                 switch (event.keyboard.keycode) {
  231.                     case ALLEGRO_KEY_ESCAPE:
  232.                         game_over = true;
  233.                         break;
  234.                     case ALLEGRO_KEY_LEFT:
  235.                         velCarro1 -= .1;
  236.                         break;
  237.                     case ALLEGRO_KEY_RIGHT:
  238.                         velCarro1 += .1;
  239.                         break;
  240.                     case ALLEGRO_KEY_UP:
  241.                         rest += 0.001;
  242.                         break;
  243.                     case ALLEGRO_KEY_DOWN:
  244.                         rest -= 0.001;
  245.                         if (rest < 0) rest = 0;
  246.                         break;
  247.                     case ALLEGRO_KEY_SPACE:
  248.                         sun = !sun;
  249.                         if (sun) {
  250.                             al_set_target_bitmap(bufferSfondo);
  251.                                 al_draw_filled_circle(800,100,40,al_map_rgb(250, 250, 0));
  252.                             al_set_target_backbuffer(display);
  253.                         }
  254.                         else {
  255.                             al_set_target_bitmap(bufferSfondo);
  256.                                 al_draw_bitmap(background, 0, 0, 0); // ripristino background su bufferSfondo
  257.                             al_set_target_backbuffer(display);
  258.                         }
  259.                         break;
  260.                 }
  261.             }
  262.             if (event.type == ALLEGRO_EVENT_MOUSE_BUTTON_DOWN) {
  263.                 al_get_mouse_state(&mouse_state);
  264.  
  265.                 if (mouse_state.buttons & 1) // Left mouse button
  266.                 {
  267.                     // l'immagine scroll scorre, alla cordinata mouse.x va tolta la coordinata scroll_x
  268.                     int calcolo = event.mouse.x - scroll_x;
  269.                     // l'immagine scroll è duplicata se si clicca sulla seconda...
  270.                     if (calcolo>1000) calcolo -= 1000;
  271.                     al_set_target_bitmap(bufferScroll);
  272.                         al_draw_filled_rectangle(calcolo,event.mouse.y,calcolo+1,event.mouse.y+3,al_map_rgb(120, 250, 120));
  273.                     al_set_target_backbuffer(display);
  274.                 }
  275.                 else if (mouse_state.buttons & 2) // Right mouse button
  276.                 {
  277.                     al_set_target_bitmap(bufferScroll);
  278.                         // cancello con rgba, perchè il png scroll ha il canale alpha
  279.                         al_clear_to_color(al_map_rgba_f(0.0, 0.0, 0.0, 0.0));
  280.                         al_draw_bitmap(scroll, 0, 0, 0); // ripristino scroll su bufferScroll
  281.                     al_set_target_backbuffer(display);
  282.                 }
  283.             }
  284.         }
  285.  
  286.         al_draw_bitmap(bufferSfondo, 0, 0, 0); // sfondo fisso, cancella tutta la scena
  287.         // Aggiorna la posizione delle immagini
  288.         x ++; // coordinata scroll, elicotteri e carro2
  289.         xCarro1 += velCarro1;  // coordinata carro1_abc
  290.         //if (xCarro1 > WIDTH) xCarro1 = -600; // riparte fuori dallo schermo
  291.         //if (xCarro1 < -600) xCarro1 = WIDTH; // riparte fuori dallo schermo
  292.         // equivalente ternario è meglio?
  293.         xCarro1 = (xCarro1 > WIDTH ? -600 : (xCarro1 < -600 ? WIDTH : xCarro1));
  294.  
  295.         if (x > WIDTH) x = -200; // riparte fuori dallo schermo
  296.  
  297.         al_draw_bitmap(sprite2, x + 120, 100, 0); // elicottero2 resta dietro le nuvole
  298.         al_draw_bitmap(sprite4, (WIDTH+20) -x * 1.2 , 260, 0); // carro2 resta dietro a carro1_abc
  299.  
  300.         int speed = 19 + velCarro1*15;
  301.         int rit = rest * 1000;
  302.         snprintf(sRit, sizeof(sRit), "- ritardo %d ms.", rit);
  303.         snprintf(sStamp, sizeof(sStamp), "Speed Carro %d Km/h %s", speed, sRit );// creazione stringa per stampa a video
  304.  
  305.         if (speed > 0) { // ruote in avanti a b c
  306.             switch (++anim) {
  307.                case 3:
  308.                     anim=0;
  309.                     al_draw_bitmap(sprite3_a, xCarro1, 230, 1); // carro1_a resta dietro il muretto/cancello
  310.                     break;
  311.                case 1:
  312.                     al_draw_bitmap(sprite3_b, xCarro1, 230, 1); // carro1_a resta dietro il muretto/cancello
  313.                     break;
  314.                case 2:
  315.                     al_draw_bitmap(sprite3_c, xCarro1, 230, 1); // carro1_a resta dietro il muretto/cancello
  316.                     break;
  317.            }
  318.         }
  319.  
  320.         if (speed == 0) al_draw_bitmap(sprite3_a, xCarro1, 230, 1); // ruote ferme
  321.  
  322.         if (speed < 0){ // ruote indietro c b a
  323.             switch (++anim) {
  324.                case 3:
  325.                     anim=0;
  326.                     al_draw_bitmap(sprite3_c, xCarro1, 230, 1); // carro1_c resta dietro il muretto/cancello
  327.                     break;
  328.                case 1:
  329.                     al_draw_bitmap(sprite3_b, xCarro1, 230, 1); // carro1_b resta dietro il muretto/cancello
  330.                     break;
  331.                case 2:
  332.                     al_draw_bitmap(sprite3_a, xCarro1, 230, 1); // carro1_a resta dietro il muretto/cancello
  333.                     break;
  334.            }
  335.         }
  336.         // Disegna lo scroll con nuvole e cancello due volte,
  337.         // la seconda solo per coprire la larghezza dello schermo
  338.         al_draw_bitmap_region(bufferScroll, 0, 0, 1000, HEIGHT, scroll_x, 0, 0);
  339.         al_draw_bitmap_region(bufferScroll, 0, 0, WIDTH, HEIGHT, scroll_x + 1000, 0, 0);
  340.         al_draw_bitmap(sprite1, x*1.4, 70, 0); // elicottero resta avanti le nuvole
  341.         // Aggiorna la coordinata dello scroll
  342.         scroll_x -= 1;
  343.         // Se l'immagine di scroll è uscita dallo schermo, torna all'inizio
  344.         if (scroll_x <= -1000) scroll_x = 0;
  345.         // stampa stringa preparata centrata avanti a tutto
  346.         al_draw_text(font, al_map_rgb(40, 20, 200), WIDTH/2, 230, ALLEGRO_ALIGN_CENTER, sStamp );
  347.  
  348.         al_flip_display(); // scambia lo schermo al V_Sync
  349.         al_rest(rest); // attesa in secondi
  350.     }
  351.     destroy();
  352.     return 0;
  353. }



allegate risorse


Carlo ha allegato un file: Risorse.zip (843857 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da Carlo il 13/04/2023 alle 19:34


in programmazione tutto è permesso
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 0:03
Venerdì, 14/04/2023
Carlo: "il 'tearing effect' è stato eliminato con il doppio buffer che swappa i due layer al vertical blank."

Potresti dirmi qualcosa di più in merito a questo punto? Mi son perso qualcosa?

A proposito del tuo codice, invece, noto che hai chiamato i "personaggi" del tuo programma dimostrativo sprite1, sprite2, sprite 3_a, ecc. Non sarebbe stato più conveniente assegnare dei nomi che richiamassero più chiaramente l'elemento grafico che sono destinati a rappresentare?


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1344
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 2:39
Venerdì, 14/04/2023
Testo quotato

Postato originariamente da AldoBaldo:

Carlo: "il 'tearing effect' è stato eliminato con il doppio buffer che swappa i due layer al vertical blank."

Potresti dirmi qualcosa di più in merito a questo punto? Mi son perso qualcosa?


In C# o VB quando si programma con un progetto WinForm, il Form ha la proprietà DoubleBuffer che può essere impostata a true o false, non bisogna fare null'altro tutte le operazioni di disegno GDI+ avvengono nel layer nascosto e solo al termine delle operazioni di disegno mostrato a video, lo swap è sincronizzato con il v_sync ed evita le fastidiose spezzature negli elementi grafici che si muovono che invece avvengono se il disegno del Form non è sincronizzato con il refresh del monitor. Se si programma in WPF tutti gli oggetti grafici si avvalgono delle directx, con tutti i vantaggi che ne conseguono.
Testo quotato


A proposito del tuo codice, invece, noto che hai chiamato i "personaggi" del tuo programma dimostrativo sprite1, sprite2, sprite 3_a, ecc. Non sarebbe stato più conveniente assegnare dei nomi che richiamassero più chiaramente l'elemento grafico che sono destinati a rappresentare?


Hai ragione, sono partito con uno sprite, poi il 2 il 3 e il 4, poi il 3 è diventato 3_a, 3_b, 3_c, le prime immagini che caricavo erano a caso, solo dopo hanno preso un'identità. Correzione da fare.

Hai installato Allegro5? Mi sembra molto intuitivo ed efficiente, tutti gli eventi abilitati non hanno rallentato di nulla il ciclo di gioco, mentre l'aggiunta del testo ha mangiato quasi mezzo millisecondo.
Prossimo test, proiettili sparati che viaggiano nello schermo, voglio vedere quanti se ne riescono a muovere in modo indipendente.

Ultima modifica effettuata da Carlo il 14/04/2023 alle 2:48


in programmazione tutto è permesso
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 700
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 0:41
Lunedì, 17/04/2023
Carlo: "Hai installato Allegro5?"

No. Come ti ho detto, tempo fa provai SDL, ma non ne rimasi soddisfatto: anche un programmino da niente finiva per essere costituito da una quantità di file, alcuni dei quali di dimensioni rilevanti, il che mi infastidiva non poco. Allegro è una derivazione di SDL, quindi credo che condivida questa caratteristica.


ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo