next up previous
Next: Jemný úvod do myšovania Up: grafika Previous: Obrázky alebo "Monu Lisu

Škriatkovia alebo "Obrázky s dierami."

Určite ste niekedy hrali niektorú z klasických 2D počítačových hier ako napríklad Super Mario alebo Prince of Persia. Skrátka hry, v ktorých pobehujú nejaké postavy, povaľujú sa nejaké predmety a hlavného hrdinu treba niekam bez ujmy na zdraví dopraviť. Tiež si možno pamätáte na korytnačky z Comenius Loga, ktoré boli miestami priesvitné a ktoré mohli pobehovať po pracovnej ploche bez toho, aby ju poškodili. V oboch týchto prípadoch (a v mnohých ďaľších) prichádzajú ku slovu sprity (čítaj sprajty).

Sprite (po anglicky škriatok alebo strašidlo) je obrázok, ktorý nemusí mať nutne obdĺžnikový tvar a ktorý môžete vykresliť kdesi na obrazovku. Sprity, ktoré používa Allegro sú obyčajné bitmapy, na ktorých vykreslenie sa použila špeciálna funkcia draw_sprite. Miesta, ktoré na obrázku majú jasnofialovú farbu (makecol(255,0,255)) sa pokladajú za diery a pri kreslení sa vynechávajú.

Na nasledujúcom príklade si ukážeme, ako sa dá s pomocou spritov spraviť jednoduchá animácia. Okrem programu budete potrebovať päť obrázkov sln1.tga, sln2.tga, sln3.tga, sln4.tga a sln5.tga (všetky majú rozmer 100x100 bodov). Prečítajte si pozorne program a najmä komentár, ktorý po ňom nasleduje.

Takže deklarácie budú vyzerať takto:

 1   BITMAP *obrazok[5];
 2   BITMAP *kuspozadia, *vysledok;
 3   int i;
a hlavný kód takto:
 4   obrazok[0] = load_bitmap("sln1.tga",NULL);
 5   obrazok[1] = load_bitmap("sln2.tga",NULL);
 6   obrazok[2] = load_bitmap("sln3.tga",NULL);
 7   obrazok[3] = load_bitmap("sln4.tga",NULL);
 8   obrazok[4] = load_bitmap("sln5.tga",NULL);
 9   kuspozadia = create_bitmap(100,100);
10   vysledok = create_bitmap(100,100);
11
12   for( i = 0; i < 320; i++)
13           line(screen, 0, i, 640, i, makecol(128 + i/5, 128 + i/5, 255));
14   for( i = 320; i < 640; i++)
15           line(screen, 0, i, 640, i, makecol(0, 255 + 320 - i, 0));
16   blit(screen, kuspozadia, 400, 100, 0, 0, 100, 100);
17   i = 0;
18   while( ! keypressed())
19   {
20         blit(kuspozadia, vysledok, 0, 0, 0, 0, 100, 100);
21         draw_sprite(vysledok, obrazok[i], 0, 0);
22         blit(vysledok, screen, 0, 0, 400, 100, 100, 100);
23         i = (i + 1) % 5;
24         rest(100);
25   }
26
27   for(i = 0; i < 5; i++)
28         destroy_bitmap(obrazok[i]);
29   destroy_bitmap(kuspozadia);
30   destroy_bitmap(vysledok);

V deklaráciach máme pole piatich smerníkov na bitmapy obrazok[0]obrazok[4] do ktorých uložíme sprity zo súborov, smerníky na dve pomocné bitmapy kuspozadia a vysledok a jednu pomocnú celočíselnú premennú i.

V hlavnom kóde najprv načítame jednotlivé bitmapy (riadky 4-8). Bitmapy kuspozadia a vysledok musia byť pred použitím vytvorené funkciou
create_bitmap. V riadkoch 12-13 nakreslíme oblohu (vodorovné čiary, prechod z bledomodrej do eštebledšomodrej) a v riadkoch 15-16 trávnik (prechod od zelenej do tmavozelenej).

Keď sme si takto vytvorili pozadie, môžeme sa venovať spritom. Päť spritov, ktoré máte k dispozícii vytvára animáciu slniečka. Keby sme ich však na obrazovku plácali jeden cez druhý, tie staré by nezmizli a bol by z toho chaos. Preto to treba spraviť šikovnejšie. Na riadku 16 si do bitmapy kuspozadia uložím kus pozadia vpravo dole od bodu [400,100]. Kreslenie potom bude prebiehať tak, že si kuspozadia skopírujeme do bitmay vysledok, pridáme tam patričný sprite a celý výsledok skopírujeme naspäť na obrazovku.

Hlavný cyklus je na riadkoch 18-25. Beží až kým niekto nestlačí nejakú klávesu (zisťuje mi to funkcia keypressed()). Na riadku 20 skopírujeme kuspozadia do vysledok. Na riadku 21 nakreslíme do bitmapy vysledok sprite obrazok[i] (i sa meni od 0 do 4). Funkcii draw_sprite treba povedať do ktorého obrázku sa ide kresliť, aký sprite a na ktoré miesto. Na riadku 22 skopírujeme výsledok na správne miesto na obrazovke. Keď je všetko hotové, zväčšíme i o 1 a osekneme modulo 5, aby sme nabudúce kreslili ďalší sprajt v poradí (riadok 23) a počkáme 100 milisekúnd (funkcia rest) aby to nebežalo príliš rýchlo (riadok 24).

Akonáhle niekto stlačí klávesu, cyklus skončí. Na riadkoch 27-30 zlikvidujeme bitmapy a program môže skončiť tiež.



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

Úloha č.2 Ako to pobeží, ak vynecháte riadok 24? Čo to spraví, ak budete výsledok v riadku 22 kopírovať na pozíciu [400,350] miesto na [400,100]?

Úloha č.3 Prerobte program tak, že sa budú sprity miesto tej obchádzky cez dve bitmapy vykreslovať priamo na obrazovku. Ako to bude vyzerať?

Úloha č.4 Vykreslite na obrazovku 40 náhodne umiestnených slniečok zo súboru sln1.tga. Dávajte si pozor, aby ste ich neumiestnili na trávnik.


next up previous
Next: Jemný úvod do myšovania Up: grafika Previous: Obrázky alebo "Monu Lisu
Anino Belan
anino(at)smnd.sk