Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
C/C++
Allegro - Časovač (10. díl)
14. března 2002, 00.00 | V dnešním díle se seznámíme s časovačem, který je nepostradatelnou součástí v programování her. Pomocí časovače se dělá synchronizace scény a další věci. My si dnes ukážeme jak vypočítat rychlost scény tedy FPS - Frames per second.
Neboli Timer. Je taky jedna z důležitých věcí, které při programování her usnadní život nebo nervy. A proto nadešel čas se s ním seznámit.
O co vlastně jde?
Nevím, jak bych jednou větou řekl o co jde, ale vysvětlím jeho praktické použití v programu. Potřebujete například vaší proměnnou int x každých 50 ms sekund zvětšovat o jedničku. Jak to uděláte? Bud pomocí assembleru jako rezidentní program nebo si budete hlídat čas a když uběhne 50 ms tak zavoláte x++. To je sice všechno hezké, ale zbytečné. Allegro nám nabízí několik funkcí, které se o tyto události postarají za nás. My "jenom" nastavíme příslušné proměnné, které chceme např. inkrementovat a allegro je bude na pozadí programu za nás inkrementovat (nemusí to být nutně inkrementace). Pomocí toho se například dobře a docela přesně vypočítává velikost FPS (Frame Per Second) tedy počet překreslení obrazovky.
Vše vysvětlím na praktickém příkladě, který pouze počítá FPS a kreslí náhodně čáry pro zpomalení:
|
Na začátku programu si vytvoříme dvě proměnné. První timer deklarujeme jako volatile(to musí být pro práci s proměnnou pro časovač) a druhou na výpočet FPS tedy fps. Další si nadefinujeme funkci, která se nám postará o inkrementaci naší proměnné timer. Tělo této funkce bude pouze obsahovat timer++; což nám bohatě stačí.
A tady pozor - nesmíme zapomenout na makro
END_OF_FUNCTION(inc_timer);
s názvem té naší funkce jako parametr, protože by jinak program nepracoval správně. Je to něco jako, když máme za funkcí main makro pro konec, ale ta má pro ukončení svoje vlastní.
Nyní se už dostáváme do vlastní funkce main, v které provedeme inicializaci allegra, klávesnice a taky časovače. A to pomocí funkce
install_timer();Vidíte jak si je Allegro podobné? Poté, co nastavíme
rozlišení a nahodíme grafický mód je třeba inicializovat proměnou a
funkci pro časovač nebo spíše zamknout.
První makro LOCK_VARIABLE nám zamkne proměnnou do paměti(proto jsme si
deklarovali jako volatile). Druhé makro nám zamkne funkci tedy LOCK_FUNCTION.
Toto je potřeba udělat pokaždé, když pracujeme s časovačem. Z toho vyplívá,
že se to nemusíte učit nazpaměť, ale stačí pouze vědět, že je to pro
alokaci paměti, protože se to bude chovat jako rezidentní program, tak aby se
nestalo, že si tyto data přepíšete. Můžete a nejspíš budete tyto řádky
do svých programů kopírovat a jenom měnit názvy proměnných a funkcí.
Další důležitá funkce
int install_int(void (*proc)(), int speed);jako první parametr bere ukazatel na funkci (v našem případě inc_timer) a jako druhý parametr bere rychlost nebo čas, po kterém se má tato funkce volat(V našem případě 1000, což znamená 1000 ms = 1s). Z toho vyplývá, že parametr speed je udávaný v milisekundách.
Nakonec našeho programu spustíme smyčku do té doby, než je stisknuta klávesa ESCAPE. Ve smyčce se odehrává jen několik málo příkazů.
Když se nebudeme dívat na podmínku if tak co nám ve smyčce zbyde je vykreslení čáry rovnou na obrazovku s náhodné barvě a na náhodnou pozici a inkrementace naší globální proměnné fps.
A nyní k FPS - což je počet snímků za vteřínu. A proto jsme timer spustili na volání naší funkce 1x za vteřinu tedy 1000 milisekund.
Tedy pokud se vrátíme k podmínce if, tak ta nám zjistí zda uběhla vteřina od posledního volání funkce inc_timer. Tedy po uběhnutí 1s vykreslíme počet fps na obrazovku, což je počet průchodů smyčkou a počet vykreslených čar za jednu vteřinu. A nakonec obě proměnné vynulujeme za účelem dalšího použití pro výpočet.
FPS je spíše počet překreslení scény za 1s a v našem případě my obrazovku ani nemažeme ani nepřekreslujeme celou, ale je to z toho důvodu, že jsem chtěl příklad co nejvíce zjednodušit. Můžete si tedy do programu dodělat např. Double Buffering a složitější scénu.
V Allegru v podadresáři examples je ukázkový příklad na časovač pod názvem extimer.
Dnešní ukázkový příklad si můžete stáhnout zde.
Obsah seriálu (více o seriálu):
- Allegro - Knihovna pro programování her I.
- Allegro - Knihovna pro programování her II.
- Allegro - Knihovna pro programování her III.
- Allegro - Knihovna pro programování her IV.
- Allegro - Myš a klávesnice (5. díl)
- Allegro - Jednoduchá hra Střelba (6. díl)
- Allegro - Instalace a konfigurace (7. díl)
- Allegro - Hudba a zvuky (8. díl)
- Allegro - Midi a zvukové proudy (9. díl)
- Allegro - Časovač (10. díl)
- Allegro - Vektory a synchronizace scény (11. díl)
- Allegro - Datové soubory a práce s nimi (12. díl)
- Allegro - Datové soubory a práce s nimi podruhé (13. díl)
- Allegro - Tetris, nic těžkého (14. díl)
- Allegro - Animace (15. díl)
- Allegro - Bitmapy do hloubky a page flipping(16. díl)
- Allegro - MP3 (17. díl)
- Allegro - MP3 podruhé (18. díl)
- Allegro - MP3 potřetí (19. díl)
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007