Welcome, Guest. Please login or register. Did you miss your activation email?

Author Topic: [Allegro4]Hello World  (Read 1454 times)

Offline Claudiu

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 10
  • Posts: 1058
    • Facebook
[Allegro4]Hello World
« on: 11-05-2009, 10:15 »
Hello world!

Uite ca am ajuns la primul program, finally. Tineti minte ca data trecuta v-am rugat sa salvati un proiect, New Allegro Project right? Ei bine, am sa va rog sa intrati in Code::Blocks si sa-l deschideti. Ar trebui sa fie un proiect blank 100%, adica nici macar sa nu contina un main.cpp, doar proiectul in format C::B (Code::Blocks, asa am sa-l prescurtez de acum inainte).

Avem de ales, fie mergem la File -> New... -> File..., fie facem ca in imaginea urmatoare (am uitat sa incercuiesc, dar cred ca v-ati dat seama ca e vorba de icoana cu o foaie alba)


Din fereastra care urmeaza alegem C/C++ source, apoi intre C si C++ alegem varianta a doua (mai tarziu voi folosi clase, de aceea vreau sa merg de la inceput pe C++. Daca vreti insa, puteti sa mergeti pe C si sa folositi structuri, este decizia voastra). Mai avem de ales numele fisierului, sa zicem "new_allegro.cpp" in folderul in care avem salvat proiectul (mi se pare ca e default oricum). Bifati de asemenea si cele doua versiuni de build, Release si Debug:


Ok, daca totul a decurs cum trebuie aveti acum fisierului nou creat deschis. Vom scrie o simpla aplicatie Hello World! pe care o salvam ca template, ceea ce inseamna ca putem sa alegem New -> Project - New Allegro Project pentru urmatoarele programe. Aveti aici codul sursa pentru Template. Practic nu face nimic, insa aceasta "bucata" de cod va fii folosita pentru fiecare program scris in Allegro. Commenturi cu referire la "ce face functia aia?" le veti gasi in programul urmator.
Code: [Select]
#include <Allegro.h>

int main(void)
{
        if (allegro_init() != 0)
        return 1;

        install_keyboard();
        install_mouse();

        set_color_depth(16);
        if (set_gfx_mode(GFX_AUTODETECT, 1024, 768, 0, 0) != 0) {
                if (set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0) != 0) {
                        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
                        allegro_message("Nu s-a putut seta rezolutia!\n%s\n", allegro_error);
                        return 1;
                }
        }
    return 0;

}
END_OF_MAIN()

Dupa ce am scris (sau mai bine copiat) codul de mai sus in proiectul nostru nu mai avem decat sa-l salvam ca template astfel:


Vi se va cere numele sub care vreti sa fie salvat template-ul si cam asta este tot  :)

Odata ce am facut asta putem sa inchidem proiectul, pentru a crea programul "Hello World!". File -> New... -> Project.... De data aceasta alegem User Templates din coloana din stanga apoi New Allegro Project. Restul pasilor ii cunoasteti, mai jos aveti sursa programului "Hello world" dar si la atasament aveti proiectul, sursa si exectuabilul.

Code: [Select]
#include <Allegro.h>
#include <stdlib.h>

int main(void)
{
        /*! allegro_init() initializeaza linraria Allegro dar se ocupa si de "oprirea sa". Este indicat
        *** sa testati daca aceasta functie returneaza 0 sau nu pentru a evita erori nedorite :)
        **/
        if (allegro_init() != 0)
        return 1;

        /*! Urmatoarele instructiuni vorbesc de la sine, right?
        **/
        install_keyboard();
        install_mouse();

        /*! Acum vom seta modul grafic, sa zicem 1024*768 cu color depth de 16 biti, mai mult decat suficient pentru
        *** un program asa simplu, dar si pentru un joc, de ce nu?
        **/
        set_color_depth(16); //! set_color_depth() poate primi ca parametru 8, 16, 24 sau 32

        /*! Urmatoarea "bucata" de cod initializeaza rezolutia, din nou aceasta este o functie care poate "esua" deci
        *** este mai mult decat indicat sa verificati daca aceasta returneaza 0, iar daca nu, fie incercati o alta rezolutie,
        *** fie parasiti programul cu un mesaj de eroare.
        ***
        *** set_gfx_mode() este functia "responsabila" de setarea rezolutiei. Primul parametru indica modul grafic. Momentan
        *** nu trebuie decat sa stim ca GFX_AUTODETECT este cea mai buna solutie daca nu vrem batai de cap, si mai avem doua
        *** optiuni: GFX_AUTODETECT_FULLSCREEN si GFX_AUTODETECT_WINDOWED. Cred ca va dati seama singuri despre ce e vorba,
        *** retineti insa ca in modul "GFX_AUTODETECT_WINDOWED" nu sunt valabile toate posibilitatile unei ferstre native a
        *** OS-ului folosit. Mai multe detalii pe parcurs. Urmatorii doi parametri sunt rezolutia ecranului iar ultimii doi
        *** reprezinta marimea virtuala a ecranului (setata la 0 inseamna ca nu folosim asa ceva, momentan)
        **/
        if (set_gfx_mode(GFX_AUTODETECT, 1024, 768, 0, 0) != 0) {
                if (set_gfx_mode(GFX_AUTODETECT, 800, 600, 0, 0) != 0) {

                        //! GFX_TEXT indica faptul ca nu setam niciun mod video, un fel de consola daca vreti...
                        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);

                        //! allegro_message() returneaza un mesaj utilizatorului printr-un pop-up window specific OS-ului
                        allegro_message("Nu s-a putut seta rezolutia!\n%s\n", allegro_error);
                        return 1;
                }
        }

        /*! Ok, odata ajunsi aici inseamna ca am reusit sa initializam tot. Haideti sa scriem "Hello world!" si sa
        *** miscam acest text cu ajutorul mouse-ului, de asemenea vom schimba culoarea dand click stanga sau apasand
        *** tasta "C". Cu click dreapta sau apasand tasta "R" sau "E" schimbam intre romana/engleza iar pe [ESC] parasim programul.
        **/

        bool done = false;  //! conditia buclei principale, cand devine adevarata parasim programul
        bool limba = false; //! limba in care e scris mesajul. False -> Engleza, True -> Romana
        int culoare = makecol(255, 255, 255); //! initializam culoarea textului cu alb. makecol(Red, Green, Blue)

        /*! BITMAP este o structura Allegro. Aceasta reprezinta o suprafata pe care se poate desena. De asemenea Allegro
        *** mai defineste screen, care este tot un bitmap, insa are prefinite anumite proprietati, veti vedea mai tarziu.
        *** De fiecare data cand creem un BITMAP trebuie sa-l si initializam cu create_bitmap(), altfel alocam de doua ori
        *** memorie pentru aceeasi "suprafata". create_bitmap primeste doi parametri, care definesc dimensiunea bitmapului.
        *** In exemplul de fata folosim SCREEN_W si SCREEN_H, variabile definite de Allegro ca fiind rezolutia
        *** ecranului.
        **/
        BITMAP* text = create_bitmap(SCREEN_W, SCREEN_H);
        clear_bitmap(text); //! De asemenea apelam clear_bitmap() pentru a fii siguri ca nu contine "junk data"

        /*! Nu vrem ca printr-o greseala sa apara si cursorul pe ecran. Daca vreti totusi sa fie afisat, scrieti instructiunea
        *** de mai jos in interiorul buclei principale, inlocuind NULL cu text.
        **/
        show_mouse(NULL);

        while (!done) {
            if (limba == false) {
                /*! O functie de afisare text, foarte similara cu printf() din C
                *** Primul parametru reprezinta birmapul sursa, al doilea specifica ce font este folosit (daca scriem
                *** pur si simplu font cum am facut mai jos il va folosi pe cel default), apoi coordonatele textului,
                *** culoarea textului (cea specificata mai sus, culoarea fundalului (-1 ca mai jos inseamna ca nu vrem
                *** culoare pe fundal), apoi textul. Avantajul e ca aici putem folosi specificatori de format sau variabile
                *** ca in C. De exemplu puteam sa scriem textprintf_ex([...], "%s", hello), unde [...] sunt primii parametrii,
                *** iar hello este un sir de caractere definit ca "Hello World".
                *** mouse_x si mouse_y reprezinta coordonatele mouseului, definite de Allegro.
                **/
                textprintf_ex(text, font, mouse_x, mouse_y, culoare, -1, "Hello world!");
            } else textprintf_ex(text, font, mouse_x, mouse_y, culoare, -1, "Salutare skullbox.info!");

            //! Acum afisam instructiunile pe ecran:

            textprintf_ex(text, font, 10, 10, makecol(255, 255, 255), -1, "Click dreapta -> schimba mesaj");
            textprintf_ex(text, font, 10, 25, makecol(255, 255, 255), -1, "Click stanga  -> schimba culoare");
            textprintf_ex(text, font, 10, 40, makecol(255, 255, 255), -1, "Tasta 'C'     -> schimba culoare");
            textprintf_ex(text, font, 10, 55, makecol(255, 255, 255), -1, "Tasta 'E'     -> mesaj engleza");
            textprintf_ex(text, font, 10, 70, makecol(255, 255, 255), -1, "Tasta 'R'     -> mesaj romana");
            textprintf_ex(text, font, 10, 85, makecol(255, 255, 255), -1, "Tasta 'ESC'   -> formatare HDD :(");

            /*! mouse_b este o alta variabila definita de Allegro care reprezinta starea unui buton de mouse. Folositi
            *** operatia pe biti "&" cu un numar si testati daca expresia este adevarata.
            ***
            *** mouse_b & 1 -> butonul stang
            *** mouse_b & 2 -> butonul drept
            *** mouse_b & 3 -> butonul din mijloc
            *** Lista poate continua pentru mouse-uri cu mai multe butoane
            **/
            if ((mouse_b & 1) || (key[KEY_C])) {
                //! Aici folosim rand()%256 pentru a obtine valori aleatorii intre 0..255 ca sa generam culori
                culoare = makecol(rand()%256, rand()%256, rand()%256);

            } else if (mouse_b & 2) {
                if (limba == false) limba = true;
                    else limba = false;
            }

            if (key[KEY_E]) limba = false;
                else if (key[KEY_R]) limba = true;

            /*! Mai sus am scris pe bitmapul creat de noi, BITMAP* text, insa nu l-am "randat" pe ecran. Defapt, singurul
            *** bitmap care se vede este cel predefinit de Allegro, screen.Pentru randare corecta trebuie sa declaram
            *** acquire_screen() inainte si release_screen() dupa ce am  desenat.
            **/
            acquire_screen();

            /*! Inca o functie noua :) Functia blit, nu face altceva decat sa copieze o portiune sau un bitmap pe altul.
            *** Parametrii, in ordine, reprezinta: bitmapul sursa, destinatia, coordonatele sursa x si y, coordonatele
            *** destinatiei x si y si marimea portiunii copiate. Daca marimea este mai mare nu are nimic, insa daca e mai mica
            *** decat ceea ce vrem sa copiem, operatia va fii una de crop
            **/
            blit(text, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
            release_screen();

            /*! Stergem din nou bitmapul dupa ce l-am folosit deoarece inca avem textul scris pe el, ceea ce inseamna ca in
            *** loc sa miscam textul pe ecran asa cum ne-am astepta, vom lasa o urma, ca si cum am desena.
            **/
            clear_bitmap(text);

            if (key[KEY_ESC]) done = true;
        }

    //! Orice bitmap creat trebuie si "distrus", acesta ocupand memorie. Think new -> delete
    destroy_bitmap(text);
    return 0;

}
END_OF_MAIN() //! END_OF_MAIN() trebuie declarat la sfarsitul oricarui program Allegro pentru ca trebuie :P. Este ciudat dar si necesar :)

Codul este documentat zic eu suficient, iar comentariile sunt facute cu "/*!" respectiv "//!" deoarece acesta va fii stilul folosit pentru a ne documenta programele cu Doxygen. Nu uitati ca la fiecare proiect, in folderul in care aveti executabilul, sa includeti si alleg42.dll. Acesta se gaseste in folderul in care ati instalat Allegro, dar daca totusi nu-l gasiti, este cu siguranta in arhiva de la atasament. Fara el programele voastre nu vor rula pe calculatoare fara Allegro.

Have fun playing around. Sunt cateva probleme totusi in acest prim program pe care astept sa le descoperiti si sa le discutam :) Incarcam prea mult daca le rezolvam de la inceput, plus ca asa vor fii mai evidente si pentru voi.

Astept sa discutam pe marginea programelului ;)

Later edit: Manual Allegro
Later edit 2: Link alternativ, download cod sursa
 
GitHub  |  Facebook

“Real men don’t use backups, they post their stuff on a public ftp server and let the rest of the world make copies.” – Linus Torvalds

Offline cyb3rmann

  • Student
  • *
  • Thank You
  • -Given: 2
  • -Receive: 0
  • Posts: 351
  • enjoying IT
    • My Website
Re: [Allegro4]Hello World
« Reply #1 on: 24-07-2009, 08:21 »
404 - Attachment Not Found
Link alternativ: File deleted
 
Imposibilul este doar ceea ce nu ne incumetam sa abordam :-bd

Offline Claudiu

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 10
  • Posts: 1058
    • Facebook
Re: [Allegro4]Hello World
« Reply #2 on: 24-07-2009, 08:39 »
Au fost niste probleme cu atasamentele... Well, here we go again :)
 
GitHub  |  Facebook

“Real men don’t use backups, they post their stuff on a public ftp server and let the rest of the world make copies.” – Linus Torvalds

Offline cyb3rmann

  • Student
  • *
  • Thank You
  • -Given: 2
  • -Receive: 0
  • Posts: 351
  • enjoying IT
    • My Website
Re: [Allegro4]Hello World
« Reply #3 on: 10-09-2009, 17:27 »
mie nu-mi apare decat un fullscreen negru apoi mesajul :""process returned o; execution time: 1.9" press any key to continue
nu trebuia sa afiseze un hello world?
 
Imposibilul este doar ceea ce nu ne incumetam sa abordam :-bd

Offline payne

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 1
  • Posts: 1584
    • OpenGL Journey
Re: [Allegro4]Hello World
« Reply #4 on: 10-09-2009, 17:32 »
[off]Nu poate placa video :)) [/off]

Ar trebui sa apara un Hello world in loc de mouse si ceva scris in partea stanga sus.

http://dl.getdropbox.com/u/1711268/demo.png
 

Offline cyb3rmann

  • Student
  • *
  • Thank You
  • -Given: 2
  • -Receive: 0
  • Posts: 351
  • enjoying IT
    • My Website
Re: [Allegro4]Hello World
« Reply #5 on: 10-09-2009, 17:56 »
am modificat rezolutia si tot nu merge
dar alte programe imi vor merge?
 
Imposibilul este doar ceea ce nu ne incumetam sa abordam :-bd

Offline payne

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 1
  • Posts: 1584
    • OpenGL Journey
Re: [Allegro4]Hello World
« Reply #6 on: 10-09-2009, 17:57 »
Glumeam cu placa video, cine stie din ce cauza e problema. Daca zici ca apare "process returned o; execution time: 1.9" inseamna ca programul merge corect.
 

Offline Claudiu

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 10
  • Posts: 1058
    • Facebook
Re: [Allegro4]Hello World
« Reply #7 on: 11-09-2009, 07:44 »
Ce versiune de Windows ai?
 
GitHub  |  Facebook

“Real men don’t use backups, they post their stuff on a public ftp server and let the rest of the world make copies.” – Linus Torvalds

Offline cyb3rmann

  • Student
  • *
  • Thank You
  • -Given: 2
  • -Receive: 0
  • Posts: 351
  • enjoying IT
    • My Website
Re: [Allegro4]Hello World
« Reply #8 on: 15-09-2009, 14:31 »
:D
 
Imposibilul este doar ceea ce nu ne incumetam sa abordam :-bd

Offline Claudiu

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 10
  • Posts: 1058
    • Facebook
Re: [Allegro4]Hello World
« Reply #9 on: 16-09-2009, 11:40 »
Nu am testat pe 7, posibil sa fie de acolo... ai dll-ul de la allegro in acelasi folder cu executabilul?
 
GitHub  |  Facebook

“Real men don’t use backups, they post their stuff on a public ftp server and let the rest of the world make copies.” – Linus Torvalds

Offline payne

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 1
  • Posts: 1584
    • OpenGL Journey
Re: [Allegro4]Hello World
« Reply #10 on: 16-09-2009, 12:46 »
Si eu am windows 7 si merge deci nu cred ca e de la windows.
 

Offline payne

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 1
  • Posts: 1584
    • OpenGL Journey
Re: [Allegro4]Hello World
« Reply #11 on: 05-01-2010, 14:02 »
CAnd ii dau build primesc
Quote
"New Alegro Project - Release" uses an invalid compiler. Skipping...
Nothing to be done.
 

Offline Claudiu

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 10
  • Posts: 1058
    • Facebook
Re: [Allegro4]Hello World
« Reply #12 on: 05-01-2010, 14:13 »
Mergi la Settings -> Compiler and Debugger -> Tab-ul Toolchain executables

Vei vedea acolo un buton "Auto-detect". Ar trebui sa-ti gaseasca locatia directorului MinGW.

 
GitHub  |  Facebook

“Real men don’t use backups, they post their stuff on a public ftp server and let the rest of the world make copies.” – Linus Torvalds

Offline payne

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 1
  • Posts: 1584
    • OpenGL Journey
Re: [Allegro4]Hello World
« Reply #13 on: 05-01-2010, 14:25 »
Works like a charm.
 

Offline Claudiu

  • Master
  • *
  • Thank You
  • -Given: 1
  • -Receive: 10
  • Posts: 1058
    • Facebook
Re: [Allegro4]Hello World
« Reply #14 on: 05-01-2010, 14:28 »
:) Good to hear that
 
GitHub  |  Facebook

“Real men don’t use backups, they post their stuff on a public ftp server and let the rest of the world make copies.” – Linus Torvalds