2. diel - Grafická knižnica Allegro pre C a C ++
Prvá funkciu pre našej hru, ktorú potrebujeme vedieť, je allegro_init (). Tá má nasledujúcu syntax: int allegro_init () Táto funkcia je potrebná, pretože inicializuje Allegro knižnicu. Ak nebudeme volať túto funkciu, bude program pravdepodobne padať (v najhoršom prípade) alebo jednoducho nebude fungovať (v najlepšom prípade). Ďalšia dôležitá premenná je tzv. Allegro_id (string), ale je deklarovaná takto: extern char allegro_id []; Môžete použiť allegro_id na zobrazenie čísla verzie pre knižnice Allegro, ktorú máte práve inštalovanú. To je dobrý spôsob, ako skontrolovať, či Allegro je správne nainštalované, takže by som mal napísať nejaký kód pre zobrazenie 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 skontrolovaní knižnice môžeme začať robiť nastavovať našej hru. Prvé čo urobíme je nastavenie grafickej karty, klávesnice, zvukové karty atď.
#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()
Teraz máte predstavu o tom, ako inicializovať jeden z režimov grafický karty v Allegru. Ale než sa ponoríme do niektorých z grafických primitív, ktoré sú zabudované do Allegra, chcem vám ukázať jednoduchý program, ktorý načíta rastrový obrázok (podporované formáty sú BMP, PCX, TGA, a LBM) a vykreslí ho na obrazovku pomocou metódy bit-block transfer (čiže zvracať v skratke). S programom budete užitočne zoznámení a s jeho funkciami pre inicializáciu grafického systému a pre nastavenie video režimu, farebnej hĺbky, atď ....
#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, ako vykresľovať v našej hre primitívne grafiku. Bude sa
nám to hodiť napr pri kolíziách pod.
Najjednoduchšie je samozrejme primitívna grafika pixel-drawing. Ideme na to, kód je tu:
#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ýsledok je tu:. <>
Teraz si ukážeme ako kresliť 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()
. <>
Tu si nakreslíme horizontálne 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()
. <>
Samozrejme, keď budete chcieť vertikálnej čiary stačí dať miesto hlina () dať vline ()
Možno sa pýtate, čo znamená textprintf (). Táto funkcia vypíše reťazec na nami zvolenej súradnice. Má mnoho parametrov.
- 1. parameter hovorí, do ktorého miesta sa má písať (znovu je to screen - obrazovka).
- 2. hovorí, akým fontom (typom písma) sa to má vykresliť. (Premenná font oznacuje štandardný systémový font).
- 3. parameter je súradnice y
- 4. parameter súradnice x
- 5. je farba 0 do 255
- 6. parameter je text, ktorý sa má vypísať. (Klasické "Môj text") atd ...
Použili sa premenné SCREEN_W a SCREEN_H, v ktorých je šírka (width) a výška (height) obrazovky. END_OF_MAIN () - túto direktívu niektoré operačné systémy (napr. Windows ale v niektorých prípadoch i Linux) potrebujú.
Môžete si samozrejme spomaliť vykresľovanie funkcií rest ().
Ted si vykreslíme obdĺžniky:
//Tato funkce nakreslí plný obdélník void rectfill(BITMAP *bmp, int x1, int y1, int x2, int y2, int color);
Tu 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 obdĺžniky:
. <>
Ak máte nejaké otázky alebo ste našli nejakú chybu napíšte. Ďakujem za předčtení článku.