Allegro - Časovač (10. díl) - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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í:

#include "allegro.h" // netreba predstavovat

volatile int timer = 0;//promenna pro timer
int fps=0;//pocet fps


//fce ktera pouze inkrementuje
void inc_timer(void)
{
   timer++;
}
END_OF_FUNCTION(inc_timer);//je potreba pro praci v pameti


int main()
{

   allegro_init();
   install_timer();//inicializujeme timer v allegru
   install_keyboard();

   set_color_depth(16);
   if (set_gfx_mode(GFX_SAFE, 640, 480, 0, 0) != 0) {
      set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
      allegro_message("Nejde grafika: \n%s\n", allegro_error);
      return 1;
   }

   LOCK_VARIABLE(timer);//zamkneme promennou
   LOCK_FUNCTION(inc_timer);//zamkneme funkci

   install_int(inc_timer, 1000);// nastavime rychlost volani 
                                // funkce na 1000 ms

   while (!key[KEY_ESC])
   {
	   fps++;

	   //ubehla vterina? (1000 ms)
	   if (timer>0)
	   {
		   rectfill(screen,0,0,640,50,0);
		   textprintf_centre(screen,font,320,10,
                      makecol(255,0,0),"FPS: %d",fps);

		   timer=0;
		   fps=0;

	   }
	   line(screen, rand()%640,rand()%430+50,rand()%640,
             rand()%430+50,makecol(rand()%255,rand()%255,
             rand()%255));
   }

   return 0;
}

END_OF_MAIN();

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):

Tématické zařazení:

 » Rubriky  » C/C++  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: