Lekce 2 - Grafická knihovna Allegro pro C a C++
V předchozí lekci, Grafická knihovna Allegro pro C a C++, jsme si uvedli open source, cross-platformní knihovnu Allegro, která je zaměřena především na hry a multimediální programování v C++.
První funkci pro naší hru, kterou potřebujeme vědět, je allegro_init(). Ta má následující syntaxi: int allegro_init () Tato funkce je nutná, protože inicializuje Allegro knihovnu. Nebudeme-li volat tuto funkci, bude program pravděpodobně padat (v nejhorším případě) nebo prostě nebude fungovat (v nejlepším případě). Další důležitá proměnná je tzv. allegro_id (string), ale je deklarována takto: extern char allegro_id []; Můžete použít allegro_id k zobrazení čísla verze pro knihovny Allegro, kterou máte právě instalovanou. To je dobrý způsob, jak zkontrolovat, zda Allegro je správně nainstalováno, takže bych měl napsat nějaký kód pro zobrazení allegro_id :
#include <conio.h> // pro getch() #include <stdlib.h> #include “allegro.h” int main() { allegro_init(); printf(“Allegro version = %s\n”, allegro_id); printf(“\nPress any key...\n”); getch(); return 0; } END_OF_MAIN();
Po zkontrolování knihovny můžeme začít dělat nastavovat naší hru. První co uděláme je nastavení grafické karty , klávesnice , zvukové karty atd.
#include "allegro.h" int main(void) { allegro_init(); // inicializace allegra install_keyboard(); // inicializace klavesnice set_color_depth(32); // nastaveni hloubky (32bit) int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); //nastaveni graficke karty(Typ,vyska,sirka,....) if (ret != 0) { // pokud graficka karta nenalezena zobrazi se chybova hlaska allegro_message(allegro_error); // error return 1; // pokud chyba vraci 1 } while (!keypressed()); //exit program allegro_exit(); return 0; } END_OF_MAIN()
Nyní máte představu o tom, jak inicializovat jeden z režimů grafický karty v Allegru. Ale než se ponoříme do některých z grafických primitiv, které jsou zabudovány do Allegra, chci vám ukázat jednoduchý program, který načte rastrový obrázek (podporované formáty jsou BMP, PCX, TGA, a LBM) a vykreslí ho na obrazovku pomocí metody zvané bit-block transfer (neboli blit ve zkratce). S programem budete užitečně seznámeni a s jeho funkcemi pro inicializaci grafického systému a pro nastavení video režimu, barevné hloubky, atd....
#include "allegro.h" int main(void) { char *filename = "alex.bmp"; //Jmeno obrazku ( nebo vašeho ) BITMAP *image; //Pointer pro obrazek (kam obrazek ulozime do jake casti pameti) allegro_init(); // inicializace allegra install_keyboard(); // inicializace klavesnice set_color_depth(32); // nastaveni hloubky (32bit) int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); //nastaveni graficke karty(Typ,vyska,sirka,....) if (ret != 0) { // pokud graficka karta nenalezena zobrazi se chybova hlaska allegro_message(allegro_error); // error return 1; // pokud chyba vraci 1 } image = load_bitmap(filename, NULL);//nascteme obrazek if (!image) { // pokud obrazek nenalezen zobrazi se chybova hlaska allegro_message("Error loading %s", filename); // error a jmeno chyby return 1; // pokud chyba vraci 1 } //vykreslime na obrazovku blit(image, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H); //odebereme bitmapu z pameti destroy_bitmap(image); //vykreslime na obrazovku udaje o rozliseni textprintf_ex(screen,font,0,0,1,-1,"%dx%d",SCREEN_W,SCREEN_H); //ceka dokud se nezmackne libovolna klavesa , jinak by program spadl while (!keypressed()); //exit program allegro_exit(); return 0; } END_OF_MAIN()
Ted si ukážeme, jak vykreslovat v naší hře primitivní grafiku. Bude se nám to hodit např při kolizích apod.
Nejjednodušší je samozřejmě primitivní grafika pixel-drawing. Jdeme na to, kód je zde:
#include <stdlib.h> #include "allegro.h" #define POCETPIX 1000 int main(void) { int x,y; int red, green, blue, color; //initialize Allegro allegro_init(); //inicializujeme klavesnici install_keyboard(); //inicializujeme generátor náhodných čísel srand(time(NULL)); //inicializujeme grafický mod na 640x480 //Můžeme na kolik chceme na rozlišení //Můžeme nastavit i hloubku 32,24,atd.... // GFX_AUTODETECT_WINDOWED - zobrazí se okno // GFX_AUTODETECT_FULLSCREEN - zobrazí se ve fullscreenu int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); if (ret != 0) { //Kontorla inicializace modu allegro_message(allegro_error); return 1; } //Zobrazí na obrazovce rozlišení obrazovky //V našem případě je to 640 x 480 textprintf_ex(screen, font, 0, 0, 15, -1, "Kreslíme pixely - %dx%d - Press ESC to quit", SCREEN_W, SCREEN_H); //čeká na stisk klávesy while(!key[KEY_ESC]) { // na stavujeme náhoně místo zobrazení pixelu od 0 do 1000 x = 10 + rand() % 1000; y = 10 + rand() % 1000; // Nastavujeme náhodnou barvu od 0 do 255 red = rand() % 255; green = rand() % 255; blue = rand() % 255; color = makecol(red,green,blue); //Kreslíme pixely putpixel(screen, x % (SCREEN_W-20), y %(SCREEN_H-20) , color); } return 0; } END_OF_MAIN()
Výsledek je zde :
Teď si ukážeme jak kreslit kružnice:
#include<conio.h> #include <stdlib.h> #include "allegro.h" int main(void) { int x,y,radius; int red, green, blue, color; //inicializujeme Allegro allegro_init(); //klávesnice install_keyboard(); //generování náhodních čísel srand(time(NULL)); //nastavení rozlišení a modu 640x480 int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); if (ret != 0) { allegro_message(allegro_error); return 1; } //vykreslení modu na obrazovku //samozdřejmě by jste měli znát taky trochu Céčko aby jste věděli formátování které se zde používá textprintf_ex(screen, font, 0, 0, 15, -1, "Kreslíme kruznice - %dx%d - Press ESC to quit", SCREEN_W, SCREEN_H); //čeká na stisk while(!key[KEY_ESC]) { //nastavujeme a umístujeme náhodně kružnice x = 30 + rand() % (SCREEN_W-60); y = 30 + rand() % (SCREEN_H-60); radius = rand() % 30; //náhodné nastavení barev 0 do 255 red = rand() % 255; green = rand() % 255; blue = rand() % 255; color = makecol(red,green,blue); //draw the pixel circle(screen, x, y,radius, color); } return 0; } //zde musí být tato direktiva END_OF_MAIN()
Zde si nakreslíme horizontální linky :
#include<conio.h> #include <stdlib.h> #include "allegro.h" int main(void) { int y,x1,x2; int red,green,blue,color; allegro_init(); install_keyboard(); srand(time(NULL)); int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); if (ret != 0) { allegro_message(allegro_error); return 1; } textprintf(screen, font, 0, 0, 15,"Kreslime linky - %dx%d - Press ESC to quit",SCREEN_W, SCREEN_H); while(!key[KEY_ESC]) { x1 = 10 + rand() % (SCREEN_W-20); y = 10 + rand() % (SCREEN_H-20); x2 = 10 + rand() % (SCREEN_W-20); red = rand() % 255; green = rand() % 255; blue = rand() % 255; color = makecol(red,green,blue); //kreslíme horizontální linky hline(screen, x1,y,x2,color); } return 0; } END_OF_MAIN()
Samozřejmě, když budete chtít vertikální čáry stačí dát místo hline() dát vline()
Možná se ptáte, co znamená textprintf(). Tato funkce vypíše řetězec na námi zvolené souřadnice. Má mnoho parametrů.
- 1. parametr říká, do kterého místa se má psát (znovu je to screen - obrazovka).
- 2. říká, jakým fontem (typem písma) se to má vykreslit. (proměnná font oznacuje standardní systémový font).
- 3. parametr je souřadnice y
- 4. parametr souřadnice x
- 5. je barva 0 do 255
- 6. parametr je text, který se má vypsat. (Klasické "Můj text") atd...
Použili se proměnné SCREEN_W a SCREEN_H, ve kterých je šířka (width) a výška (height) obrazovky. END_OF_MAIN() - tuto direktivu některé operacní systémy (např. Windows ale v některých případech i Linux) potřebují.
Můžete si samozřejmě zpomalit vykreslování funkcí rest().
Ted si vykreslíme obdelníky:
//Tato funkce nakreslí plný obdélník void rectfill(BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
Zde je úplný kod:
#include<conio.h> #include <stdlib.h> #include "allegro.h" int main(void) { int y1,y2,x1,x2; int red,green,blue,color; allegro_init(); install_keyboard(); srand(time(NULL)); int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); if (ret != 0) { allegro_message(allegro_error); return 1; } textprintf(screen, font, 0, 0, 15, "Rect Program - %dx%d - Press ESC to quit", SCREEN_W, SCREEN_H); while(!key[KEY_ESC]) { x1 = 10 + rand() % (SCREEN_W-20); y1 = 10 + rand() % (SCREEN_H-20); x2 = 10 + rand() % (SCREEN_W-20); y2 = 10 + rand() % (SCREEN_H-20); red = rand() % 255; green = rand() % 255; blue = rand() % 255; color = makecol(red,green,blue); rectfill(screen,x1,y1,x2,y2,color); // zpomalíme vykreslování :) rest(50); } return 0; } END_OF_MAIN()
Kreslíme obdelníky:
Pokud máte nějaké dotazy nebo jste našli nějakou chybu napište. Děkuji za předčtení článku.
Příště, v lekci Grafická knihovna Allegro pro C a C++, si ukážeme jak na složitější vykreslování tvarů. Použijeme k tomu například funkce sinus, cosinus, vektory a další.