|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
|
|
||||||||||
|
|
|||||||||
|
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. 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.
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||