next up previous
Next: Zvukové efekty alebo "Chcelo Up: grafika Previous: Zoznamy alebo "Ide vláčik

Klávesnica alebo "Dajako to riadiť treba."

Pri tvorbe počítačovej hry je jednou z dôležitých častí spracovanie vstupu od užívateľa. Keby sme ho totiž nespracovávali, nejednalo by sa o počítačovú hru, ale o film. Ak si odmyslíme špeciálny hardware ako volanty a snímače polohy, vstup sa deje tromi štandardnými cestami -- cez klávesnicu, cez myš alebo cez joystick.

O zisťovaní polohy myši sme už hovorili v predošlých lekciach. V tejto lekcii sa budeme venovať klávesnici. Ako už viete, jej použitie treba zapnúť funkciou install_keyboard(). Allegro vie pristupovať ku klávesnici dvoma rôznymi spôsobmi. Jeden prístup sa nazýva zásobníkový. To znamená, že stlačené klávesy sa ukladajú do zásobníka a keď ich chcete odtiaľ vytiahnuť, zavoláte si patričnú funkciu. (Pozn.: Tento prístup používa aj linuxovský shell. Keď napríklad spustíte editor bez použitia znaku &, všetko, čo stlačíte sa ukladá do zásobníka a shell tomu venuje pozornosť až keď prácu s editorom skončíte.)

Čo sa zásobníkového spracovania týka, už sme sa stretli s funkciou keypressed() ktorá vracala hodnotu pravda ak v zásobníku niečo čakalo a hodnotu nepravda ak bol prázdny. Znak zo zásobníka môžeme získať príkazom readkey(). Ak v zásobníku nič nie je, funkcia čaká dovtedy, kým tam niečo nebude. Na to, aby sme získali ASCII kód stlačeného znaku, treba ale výstup z funkcie trochu upraviť (pridaním záhadnej sekvencie & 0xff, ktorá z daného čísla ponechá posledné dva bajty), ako sa môžete presvedčiť na nasledovnom príklade.

   if ((readkey() & 0xff) == 'd')
      printf("Stlacili ste 'd'\n");
Niekedy treba obsah zásobníka vymazať. Na to slúži funkcia clear_keybuf().

Pri programovaní hier sa ale častejšie uplatní priamy prístup. Vtedy chceme vedieť, ktoré klávesy sú na klávesnici v danom momente stlačené a ktoré nie. Tento cieľ sa vďaka spôsobu, akým sú klávesnice skonštruované nedá celkom splniť, ale Allegro robí čo môže, aby ste z klávesnice dostali maximum možných informácií.

Keď inicializujete klávesnicu, máte k dispozícii automaticky definované pole key, s pomocou ktorého viete zistiť, či je určitá klávesa stlačená. Ak chceme zistiť, či je stlačená klávesa ESC, spravíme to napríklad takto:

   if (key[KEY_ESC])
      printf("ESC je stlačené.\n");
   else
      printf("ESC nie je stlačené.\n");
Na jednotlivé klávesy sa odvolávame skratkami KEY_A ... KEY_Z, KEY_0 ... KEY_9, KEY_0_PAD ... KEY_9_PAD a špeciálne klávesy ako napríklad klávesy KEY_ESC, KEY_SPACE, KEY_ENTER, KEY_LEFT, KEY_RIGHT, KEY_UP, KEY_DOWN atď. (Úplný zoznam je v dokumentácii ku knižnici Allegro.)

Použitie môžete vidieť v nasledovnom príklade, kde sa s pomocou kláves pohybuje oranžovým krúžkom:

 1   #include <allegro.h>
 2
 3   main()
 4   {
 5      int x=0,y=0;
 6      int oldx, oldy; 
 7
 8      allegro_init();
 9      install_keyboard();
10      install_timer();
11
12      set_color_depth(16);
13      set_gfx_mode(GFX_AUTODETECT_FULLSCREEN, 640, 480, 0, 0);
14   
15      circlefill(screen, x, y, 10, makecol(255,127,0));
16   
17      while(! key[KEY_ESC])
18      {
19         oldx = x;
20         oldy = y;
21      
22         if (key[KEY_LEFT] || key[KEY_4_PAD])
23            x--;
24         if (key[KEY_RIGHT] || key[KEY_6_PAD])
25            x++;
26         if (key[KEY_UP] || key[KEY_8_PAD])
27            y--;
28         if (key[KEY_DOWN] || key[KEY_2_PAD])
29            y++;
30         
31         if (x < 0) x = 0;
32         if (x > 640) x = 640;
33         if (y < 0) y = 0;
34         if (y > 480) y = 480;
35         
36         if (x != oldx || y != oldy)
37         {
38             circlefill(screen, oldx, oldy, 10, makecol(0,0,0));
39             circlefill(screen, x, y, 10, makecol(255,127,0));
40         }
41         rest(1);
42      }
43   }
44   END_OF_MAIN();
V premenných x a y uchovávame aktuálnu polohu krúžku. V riadkoch 8-13 inicializujeme veci potrebné pre Allegro. Na riadku 15 nakreslíme krúžok, ktorým budeme hýbať. Samotný program sa vykonáva v cykle na riadkoch 17 až 42, ktorý sa ukončí stlačením klávesy ESC. Na začiatku sa do premenných oldx a oldy uloží aktuálna pozícia krúžku. Na riadkoch 22-29 sa upraví aktuálna pozícia krúžku (ak je napríklad stlačená šipka vľavo KEY_LEFT, súradnica x sa zmenší o 1). Riadky 31-34 dbajú o to, aby sa krúžok nedostal mimo obrazovky. Ak sa súradnice krúžku zmenili (skontroluje sa na riadku 36), na jeho miesto sa nakreslí čierny krúžok a nový krúžok sa nakreslí na novej pozícii, čo vyvoláva zdanie pohybu.

Úloha č.1 Prečítajte, pochopte, napíšte, skompilujte a vyskúšajte. Čo sa stane, ak naraz stlačíte šipky vpravo a dole? Prečo sa to deje?

Úloha č.2 Upravte program tak, aby po stlačení klávesy F krúžok náhodne zmenil farbu.

Úloha č.3 Upravte program tak, aby sa po obrazovke hýbal sprit slniečka.

Úloha č.4 Upravte program z úlohy č.2 tak, aby sa po stlačení klávesy N krúžok presunul na nové náhodné miesto na obrazovke.

Úloha č.5 (pre guruov, aby sa neflákali) Upravte program č.3 tak, aby sa stále menili fázy slniečka. Ak to budete mať, upravte to tak, aby sa slniečko hýbalo po nejakom viacfarebnom pozadí a nezničilo ho.


next up previous
Next: Zvukové efekty alebo "Chcelo Up: grafika Previous: Zoznamy alebo "Ide vláčik
Anino Belan
anino(at)smnd.sk