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.
#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.
#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 AllegroLater edit 2: Link alternativ, download cod sursa