next up previous
Next: Čiaročky alebo "Koho si Up: grafika Previous: grafika

Už zase začiatok alebo "Hello, world!"

Jednou z najsilnejších čŕt jazyka C je jeho univerzálnosť. Môžete ho použiť pri tvorbe počítačovej hry, zložitého databázového systému, programu na modelovanie procesov v jadovom reaktore alebo textového procesora. Nech programujeme čokoľvek, stále používame základné štruktúry C-čka ako napríklad if, while, for alebo case.

Je ale zrejmé, že na písanie rôznych druhov programov je treba mať k dispozícii rôzne prostriedky. Keď programujete internetový server, budete používať úplne iné funkcie, než keď programujete hru. A práve na to slúžia jazyku C knižnice. Knižnice obsahujú funkcie z jednotlivých oblastí a programátor môže použiť tie, ktoré potrebuje.

Knižníc pre prácu s grafikou je viacero. Niektoré sú jednoduchšie, niektoré zložitejšie, niektoré sú určené pre konkrétny operačný systém, niektoré sú schopné pracovať pod rôznymi systémami. V nasledujúcich lekciach sa budeme zaoberať knižnicou Allegro. Vybrali sme ju preto, lebo je jednoduchá (áno, v porovnaní s inými je skutočne jednoduchá), lebo funguje pod všetkými operačnými a podobnými systémami, ktoré v škole máme (Linux, DOS, Windows) a pretože sa smie používať zadarmo.

Oproti doterajším zvyklostiam sme pristúpili k jednej zmene: budeme číslovať riadky v programe. Slúži to len na orientáciu v programe (programy budú dlhšie, než doteraz), tak to, prosím, nepíšte do zdrojákov.

Takže prvý grafický program (nazvite si ho hello.c):

 1  #include "allegro.h"
 2
 3  int main()
 4  {
 5     allegro_init();
 6     install_keyboard(); 
 7
 8     set_color_depth(16);
 9     if (set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0) != 0) {
10        set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
11        allegro_message("Zlyhala grafika\n%s\n", allegro_error);
12        return 1;
13     }
14
15     clear_to_color(screen, makecol(255, 255, 255));
16
17     text_mode(-1);
18     textout_centre(screen, font, "Hello, world!", 
19              SCREEN_W/2, SCREEN_H/2, makecol(0,0,0));
20
21     readkey();
22     return 0;
23  }
24
25  END_OF_MAIN();

V prvom riadku načítame hlavičkový súbor knižnice allegro. Táto sa momentálne stará o všetko. Nemusíte načítavať nič ďalšie. Na začiatku mainu v riadku 5 sa zavolá funkcia allegro_init. Táto funkcia zapína allegro a treba ju mať hneď na začiatku. Táto funkcia zistí typ operačného systému a nastaví niektoré základné premenné. Hneď po nej nasleduje funkcia install_keyboard, ktorá zapne klávesnicu.

A ideme naštartovať grafický režim. V riadku 8 sa nastavuje farebná hĺbka. Programu povieme, koľko farieb naraz budeme zobrazovať. Ak je farebná hĺbka 8, môžeme naraz zobraziť 256 farieb. Ak je farebná hĺbka 16, môžeme ich zobraziť až 65536. Farebnú hĺbku môžeme nastaviť aj na 24 alebo 32, ale to už nie každá grafická karta zvládne.

V riadku 9 sa volá funkcia set_gfx_mode, ktorá štartuje grafiku. Má 5 parametrov. Prvý hovorí o spôsobe, ako sa má grafika naštartovať.
GFX_AUTODETECT_FULLSCREEN hovorí, že sa má na zobrazenie použiť celá obrazovka. Ďalšie dva hovoria o rozlíšení (v tomto prípade 640x480 bodov). Posledné dva parametre zatiaľ pre nás nie sú dôležité.

Ak sa funkcii set_gfx_mode podarí grafiku naštartovať, vráti ako výsledok nulu. Preto sa na riadku 9 kontroluje, či je výsledok naozaj 0 a ak nie je, v 10. riadku sa nastaví (opäť s pomocou funkcie set_gfx_mode) textový režim a na 11. riadku funkcia allegro_message, ktorá funguje presne rovnako ako funkcia printf, vypíše správu, že niečo nie je v poriadku. Potom na 12. riadku program skončí.

Na riadku 15 sa volá funkcia clear_to_color. Táto funkcia vie daný obrázok vyplniť danou farbou. Ako obrázok je zadaná screen, čiže celá obrazovka. Ako farba je zadaná farba makecol(255,255,255). Farby sa určujú v RGB (red, green, blue) podobe. Každá farba je zmixovaná z týchto troch. Koľko je ktorej, určujú čísla od 0 do 255. Keď všetky tri hodnoty vypeckujeme na maximum, dostaneme najjasnejšiu možnú farbu -- bielu. Funkcia makecol nám z tých troch čísel vyrobí tú správnu farbu.

Keďže chceme vypisovať text, na riadku 17 nastavíme spôsob vypisovania. Ak funkcia text_mode dostane ako parameter farbu, nastaví ju ako farbu pozadia textu. Ak sa ale ako parameter zadá záporné číslo, pozadie bude priesvitné. Ostane bezo zmeny a vykreslovať sa budú iba písmenká.

Funkcia textout_centre vypíše do daného obrázku text. Má veľa parametrov. Prvý parameter hovorí, do ktorého obrázku sa má písať (znova je to screen -- obrazovka). Druhý hovorí, akým fontom sa to má spraviť. (font je štandardný systémový font.) Tretí parameter je text, ktorý sa má vypísať. (Klasické "Hello, world!") Štvrtý a piaty parameter určujú súradnice, kam sa má text vypísať. Použili sa premenné SCREEN_W a SCREEN_H v ktorých je šírka (width) a výška (height) obrazovky. Aby sa text vypísal do stredu obrazovky, z každého sa zobrala polovica. Posledný šiesty parameter je farba textu.

Na 21. riadku funkcia readkey čaká, kým niekto stlačí nejakú klávesu. (Špeciálne kvôli tejto funkcii sme na riadku 6 rozbehávali klávesnicu.) Na riadku 22 program skončí.

Na konci, až po skončení funkcie main je jeden podivný riadok -- riadok číslo 25. Ten tam niektoré operačné systémy (napr. Windows ale v niektorých prípadoch aj Linux) potrebujú. Tento riadok treba písať hneď za funkciu main.

Na záver ešte pár slov o tom, ako to treba skompilovať. Všetky programy, s ktorými ste sa doteraz stretli, zatiaľ okrem štandardnej knižnice libc nepoužívali nič špeciálne. Tento program ale používa knižnicu allegro. Ako funkcie z tejto knižnice vyzerajú, sa kompilátor dozvie zo súboru allegro.h, ktorý ste includli v programe. Ale samotné funkcie sa nachádzajú v súbore liballeg.a alebo liballeg.so. Aby ich linker pripojil, treba zadať linkeru zvláštny parameter -lalleg. (Vyrobíte ho tak, že od názvu knižnice odtrhnete koncovku a to "lib" na začiatku a miesto neho dáte "l".) Takže ak sa zdroják volal hello.c, kompilovať sa bude (v prípade DOSu) príkazom
gcc -o hello.exe hello.c -lalleg
a v prípade linuxu (kde je knižnica allegro rozdelená na dve časti) príkazom
gcc -o hello hello.c -lalleg -lalleg_unsharable



Úloha č.1 Napíšte, pochopte, skompilujte.

Úloha č.2 Skúste na riadku 9 dať štartový režim GFX_AUTODETECT_WINDOWED. Čo sa zmenilo? Vyskúšajte farebné hĺbky 8 a 24 (riadok 8) a rozlíšenia 320x200, 800x600 a 1024x768. Kedy to funguje a kedy nie?

Úloha č.3 Skúste zmeniť farby na riadkoch 15, 17 a 19. Upravte program tak, aby na čiernom pozadí vypísal žltý text v modrom rámčeku.

Úloha č.4 Upravte program tak, aby sa text vypísal na vrchu obrazovky. Upravte program tak, aby sa text vypísal na spodku obrazovky.


next up previous
Next: Čiaročky alebo "Koho si Up: grafika Previous: grafika
Anino Belan
anino(at)smnd.sk