Allegro.h

di il
15 risposte

Allegro.h

Salve! Sto studiando, per scuola, la libreria dell'allegro. Allo stesso tempo cerco di creare qualcosa di mio.
Vi chiedo dunque se conoscete un modo per inserire una console di testo (la classica finestra nera da programma C) dentro la quale svolgere alcune funzioni.
Vorrei infatti eseguire il programma dentro la classica console ma con intorno delle immagini (ovvero lo sfondo coperto, in parte, dalla console) che cambieranno in base alle scelte dell'utente all'interno della console.
Non so se mi sono spiegato bene, scusate

15 Risposte

  • Re: Allegro.h

    Che ide usi?
    se usi code::blocks vai in:
    project->property->build target->sulla combo type(che dovresti avere come gui application) selezioni console application controlla di avere la spunta anche subito sotto(la pausa in uscita)
  • Re: Allegro.h

    Ok. Adesso? Come piazzo la console sopra lo sfondo?
    Questo è il mio codice, dove piazzo lo spazio per la console?
    #include <stdio.h> 
    #include <string.h> 
    #include <time.h>
    #include "allegro.h" 
    int main() 
    {
        BITMAP *immagine;
        PALETTE colori; 
        allegro_init(); 
        install_keyboard(); 
        set_gfx_mode(GFX_GDI, 640, 480, 0, 0);
        immagine=load_bitmap("immagine.bmp", colori); 
        set_pallete(colori);
        blit(immagine, screen, 0, 0, 0, 0, 640, 480); 
        destroy_bitmap(immagine); 
        readkey(); 
        allegro_exit();
    }
    END_OF_MAIN () 
    Per capirci: vorrei fare un gioco testuale dove intorno alla console di gioco, vi siano delle immagini che descrivono l'inventario, la vita, le quest attive ed altri parametri.
  • Re: Allegro.h

    Per prima cosa includi l' header di <window.h>
    Poi devi cercarti l'hwnd della tua finestra di console,ci sono diverse vie ma in genere si usa la find window.
    Qui trovi la pappa pronta by Microsoft.

    Ora che hai l'handle puoi spostare la finestra semplicement con la
    Attenzione la puoi solo spostare e mettere in primo piano ma NON ridimensionare,quindi setta i flag opportuni.Per ridimensionarla non mi ricordo a memoria l'api ma a casa in qualche meandro del mio pc ce l'ho e te la posto.
  • Re: Allegro.h

    
    
    //ritorna handle console
    HWND con_gethwnd()
    {
        char ct[80];
        GetConsoleTitle(ct,80);
        return FindWindow(NULL,ct);
    }
    
    //setta il buffer dei caratteri(quanti caratteri maniene memorizzati nelle colonne e righe
    void con_setbuffercr(short c,short r)
    {
        HANDLE hconsole;
        if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
        COORD co;
        co.X=c;
        co.Y=r;
        SetConsoleScreenBufferSize(hconsole,co);
    }
    
    //setta la dimensione della console in base al numero di caratteri in colonne e righe
    //a differenza delle altre finestre non si lavora in pixel per la dimensione.
    void  con_setwincr(short c,short r)
    {
        HANDLE hconsole;
        if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        GetConsoleScreenBufferInfo(hconsole,&csbi);
        csbi.srWindow.Left = 0;
        csbi.srWindow.Top = 0;
        csbi.srWindow.Right=c;
        csbi.srWindow.Bottom=r;
        SetConsoleWindowInfo(hconsole,TRUE,&csbi.srWindow);
    }
    
    //setta la dimensione della finestra ed i numero dei caratteri che si possono inserire è
    //uguale alla dimensione della finestra,quindi nessuno scroll possibile.
    void con_setwball(short c,short r)
    {
        con_setbuffercr(c,r);
        con_setwincr(c-1,r-1);
    }
    
    
    void con_gotoxy (short x,short y)
    {
        HANDLE hconsole;
        if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
        COORD coord = {x, y};
        SetConsoleCursorPosition (hconsole,coord );
    }
    
    void con_takexy(int *x,int *y)
    {
        HANDLE hconsole;
        if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
        CONSOLE_SCREEN_BUFFER_INFO con;
        if (GetConsoleScreenBufferInfo(hconsole,&con))
        {
            *x = con.dwCursorPosition.X;
            *y = con.dwCursorPosition.Y;
        }
    }
    
    void con_cls()
    {
        HANDLE hconsole;
        if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
        CONSOLE_SCREEN_BUFFER_INFO csbi;
        const COORD startCoords = {0,0};
        DWORD dummy;
        GetConsoleScreenBufferInfo(hconsole,&csbi);
        FillConsoleOutputAttribute(hconsole,0,csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
        FillConsoleOutputCharacter(hconsole,' ',csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
        con_gotoxy(0,0);
    }
    
    void con_colorset(unsigned short color)
    {
        HANDLE hconsole;
        if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
        SetConsoleTextAttribute(hconsole,color);
    }
    
    
    Spero ti possano essere di aiuto.
    Se è venuto errato il cut/paste fammi sapere.
  • Re: Allegro.h

    Mi da come errori
    c:\codeblocksdv2\mingw\bin\..\lib\gcc\i686-mingw32\4.4.5\..\..\..\..\include\allegro\gfx.h|276|error: conflicting types for 'BITMAP'|
    c:\codeblocksdv2\mingw\bin\..\lib\gcc\i686-mingw32\4.4.5\..\..\..\..\include\wingdi.h|1356|note: previous declaration of 'BITMAP' was here|
    D:\Codeblocks\Allegro2\Untitled1.c|58|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'con_takexy'|
    D:\Codeblocks\Allegro2\Untitled1.c|83|error: expected '=', ',', ';', 'asm' or '__attribute__' before 'con_colorset'|
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #include <windows.h>
    #include "allegro.h"
    
        //ritorna handle console
        HWND con_gethwnd()
        {
            char ct[80];
            GetConsoleTitle(ct,80);
            return FindWindow(NULL,ct);
        }
    
        //setta il buffer dei caratteri(quanti caratteri maniene memorizzati nelle colonne e righe
        void con_setbuffercr(short c,short r)
        {
            HANDLE hconsole;
            if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
            COORD co;
            co.X=c;
            co.Y=r;
            SetConsoleScreenBufferSize(hconsole,co);
        }
    
        //setta la dimensione della console in base al numero di caratteri in colonne e righe
        //a differenza delle altre finestre non si lavora in pixel per la dimensione.
        void  con_setwincr(short c,short r)
        {
            HANDLE hconsole;
            if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
            CONSOLE_SCREEN_BUFFER_INFO csbi;
            GetConsoleScreenBufferInfo(hconsole,&csbi);
            csbi.srWindow.Left = 0;
            csbi.srWindow.Top = 0;
            csbi.srWindow.Right=c;
            csbi.srWindow.Bottom=r;
            SetConsoleWindowInfo(hconsole,TRUE,&csbi.srWindow);
        }
    
        //setta la dimensione della finestra ed i numero dei caratteri che si possono inserire è
        //uguale alla dimensione della finestra,quindi nessuno scroll possibile.
        void con_setwball(short c,short r)
        {
            con_setbuffercr(c,r);
            con_setwincr(c-1,r-1);
        }
    
    
        void con_gotoxy (short x,short y)
        {
            HANDLE hconsole;
            if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
            COORD coord = {x, y};
            SetConsoleCursorPosition (hconsole,coord );
        }
    
        void DLL_EXPORT con_takexy(int *x,int *y)
        {
            HANDLE hconsole;
            if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
            CONSOLE_SCREEN_BUFFER_INFO con;
            if (GetConsoleScreenBufferInfo(hconsole,&con))
            {
                *x = con.dwCursorPosition.X;
                *y = con.dwCursorPosition.Y;
            }
        }
    
        void con_cls()
        {
            HANDLE hconsole;
            if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
            CONSOLE_SCREEN_BUFFER_INFO csbi;
            const COORD startCoords = {0,0};
            DWORD dummy;
            GetConsoleScreenBufferInfo(hconsole,&csbi);
            FillConsoleOutputAttribute(hconsole,0,csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
            FillConsoleOutputCharacter(hconsole,' ',csbi.dwSize.X * csbi.dwSize.Y,startCoords,&dummy);
            con_gotoxy(0,0);
        }
    
        void DLL_EXPORT con_colorset(unsigned short color)
        {
            HANDLE hconsole;
            if ( (hconsole=GetStdHandle(STD_OUTPUT_HANDLE)) == INVALID_HANDLE_VALUE ) return;
            SetConsoleTextAttribute(hconsole,color);
        }
  • Re: Allegro.h

    Scusami mi sono dimenticato di togliere i DLL_EXPORT ,basta che elimini quel token.(ho modificato il codice,vai a vedere).
    Poi hai un conflitto trai i nomi BITMAP
    "allegro.h" dichiara BITMAP proprio come <windows.h>
    Allora il primo tentativo è non includere windows.h e vedere se allogro la include di default(dovrebbe farlo),un secondo tentativo è includere prima allegro.h e poi windows.h.
    Oppure hai due strade:
    1)
    
    #define ALLEGRO_EXTRA_HEADER
    #include "allegro.h"
    //#include <windows.h>
    
    2)
    
    #include "allegro.h"
    #define NOGDI
    #include <windows.h>
    
    Perchè includi allegro tra virgolette? dove si trovano gli header?
  • Re: Allegro.h

    Scusami, vbextreme, sono un compagno di classe di mooncroc, ho cercato di smanettare un po' con il pezzo di codice da te fornito, ma non ci sono saltato fuori, potresti solo dirmi cosa inserire nelle funzioni da te fornite? nel senso in x o in y o cose varie. Siamo alle prime armi, per adesso sono riuscito a creare solo un Space Invaders ma abbastanza semplice a livelli e cose varie.
  • Re: Allegro.h

    Con una finestra di allegro di 800x600 solo inserire la console del C dentro la finestra del Allegro, un piccolo tutorial grazie
  • Re: Allegro.h

    HWND con_gethwnd()
    questa funzione dato che è la piu complessa la analizziamo in una sucessiva puntata.

    allora iniziamo dalle basi:
    Per gestire una console si ha bisogno di un buffer che contenga i caratteri,una sottospecie di char buffer[rows][cols].
    Per settare questo buffer noi usiamo la
    void con_setbuffercr(short c,short r)
    Ad esempio di default la console ha un buffer di colonne a 80 caratteri e linee penso sempre 80.
    Ma dato che la reale finestra di console visualizza 80 colonne e circa 30/40 linee noi avremo uno scroll che ci permetta di visualizzare le rimanenti linee.
    Se noi settassimo ad esempio
    con_setbuffercr(300,30);
    toglieremo lo scroll verticale e ne avremo uno orrizzontale.
    come settare questo buffer dipende dalle necessità di un programma.
    Ad esempio in un gioco stile ascii per console non bisogna avere un buffer con le relative scroll allora in quel caso lo si setta alla stessa dimensione della finestra.

    void con_setwincr(short c,short r)
    questa funzione imposta le dimensioni della finestra ma a differenza di altre api questa lavora con i caratteri,pertanto non posso dire ad una console di ridimensionarsi a 800x600 pixel ma a 100 colonne x 50 righe.
    L'unica limitazione di questa funzione è che windows non permette di rimpicciolire la finestra sotto un certo limite imposto dal fonts utilizzato.

    void con_setwball(short c,short r)
    questa funzione non fa altro che impostare il buffer e la finestra ad una specifica dimensione,ad esempio per creare un gioco ascii allora basta chiamare questa funzione(senza dover richiamare le due funzioni prima citate) e non si avranno buffer indesiderati.

    void con_gotoxy (short x,short y)
    questa muove il cursore nella posizione voluta 0,0 è l'indice in alto a sinistra e l'indice deve essere < del buffer

    void con_takexy(int *x,int *y)
    preleva la posizione corrente del cursore.

    void con_cls()
    cancella tutto

    void con_colorset(unsigned short color)
    setta il colore della console:
    x settare il colore si usano i valori esadecimali,dato che abbiamo 16 colori fi foreground e 16 di background quindi:
    esempio:
    con_colorset(0x3D)
    3 == background verde(penso)
    D == foreground (bianco o giallo non ricordo)
    con_colorset(0x07) //colore base della console
    0 == background nero
    7 == foreground grigino

    ora prima di procedere ulteriormente iniziate a fare delle prove e vedere cosa cambia,fate un ciclo per vedere tutti i colori e quant'altro.
    Ditemi se e cosa non riuscita a comprendere.
    Poi passeremo all'uso della hwnd e alla setwindowpos.
  • Re: Allegro.h

    Grazie mille, un solo dubbio, non ho capito in modo pefetto gotoxy e takexy che valori passo alle funzioni? in allegro se non sbaglio c'era x_mouse e y_mouse oppure mi sbaglio
  • Re: Allegro.h

    Per adesso abbiamo notato lo scroll che aumenta o meno, ridimensionato la finistra di console, poi modificato i colori della console con scritte e il background di quest'ultime, per adesso aspettiamo di capire gotoxy e takexy un po' difficili da intendere, ho provato a dare dei valori e viene modificato l'inidicatore quelle dove bisogna scrivere dentro la console!
  • Re: Allegro.h

    Non facciamo confusione,la tecnica sopra citata permette di aprire un prompt dei comandi da sovrapporre alla propria finestra creata con allego.
    Se volete che sia proprio dentro allora dovete seguire la strada delle textbox e non quella della console.

    Le funzioni sopracitate quindi lavorano col prompt dei comandi appena aperto e non hanno nulla a che vedere con allegro.
    la gotoxy sposta il cursore,riferito al carret dell'inserimento carattere,nella posizione voluta.
    quindi in una classica finestra del prompt dei comandi:
    
    con_gotoxy(39,0);
    putchar('A');
    
    scriverà la lettera a centrata sulle colonne.

    Per prelevare la posizione del mouse sul prompt dei comandi si usa un'altra tecnica,ma a cosa vi serve?
  • Re: Allegro.h

    
    con_setwball(80,50);
    con_cls();
    con_gotoxy(39,24);
    putchar('V');
    
    ecco v centrata sullo schermo.

    Dimenticavo la takexy preleva la posizione attuale del cursore quindi:
    
    con_gotoxy(10,10);
    int x,y;
    con_takexy(&x,&y);
    printf("Ho iniziato a scrivere dalla posizione:%d,%d\n",x,y);
    
    spiegato?
  • Re: Allegro.h

    Ora veniamo alla movimentazione della finestra
    
    HWND con_gethwnd()
    {
        char ct[80];
        GetConsoleTitle(ct,80);
        return FindWindow(NULL,ct);
    }
    
    void con_move(int x,int y)
    {
        SetWindowPos(con_gethwnd(),HWND_TOP,x,y,0,0,SWP_NOSIZE);
    }
    
    ora per muovere la finestra basta passare le cordinate riferite ai pixel.
Devi accedere o registrarti per scrivere nel forum
15 risposte