|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
|
|
||||||||||
|
|
|||||||||
|
Na úvodNež začneme něco tvořit povíme si ve zkratce to základní o programování her. Jak by měl asi tak vypadat kód nebo spíše hlavní smyčka programu. Je opravdu hodně možností, ale pro začátek si povíme o tom nejjednodušším. Především je tento seriál o knihovně pro programování her a tudíž budeme postupně tvořit lepší a lepší hry a ne např. databázové programy ;-).Něco málo o programovaní herHlavní funkce main() by měla obsahovat inicializaci hry, hlavní smyčku (tedy vstup, přepočet scény a zobrazení na display) a odinicializaci hry nebo spíše uvolnění paměti zabrané při inicializaci.Poznámka: Asi jste si všimli, že používám převážně C a C++ jen okrajově (např. deklarace použitím, implicitní hodnoty u funkcí atd.). Tedy nepoužívám klíčové slovo class (vlastně objekty), ale k tomu se s postupem času taky dostanu, ale na tak malé ukázky se to nevyplatí. Ukázka takového zdrojového kódu v C/C++.
Jak vidíte nejedná se o nic těžkého. Jednotlivé funkce je potřeba napsat podle vlastního uvážení a především podle toho o co se to jedná za hru. Jednoduchá hra - StřelbaNejjednodušší bude si všechno ukázat na plně funkčním programu. Naprogramoval jsem jednoduchou hru kde máte za úkol sestřelit kámen na obrazovce, který po sestřelení opět vyletí, ale z jiné strany. Dohromady 10x sestřelíte kámen a vyhráli jste a pokud se tak nestane a kámen Vám uletí z obrazovky přicházíte o život. Dohromady jich máte 5.Celý program je ke stažení, ale já se budu zde zabývat jednotlivýma funkcemi, aby všichni věděli o co vlastně jde. První funkce, kterou již známe není třeba představovat je totiž popsána v dílu č.4 a jmenuje se FlipToScreen(); Další pomocnou funkcí je:
Ta nám okamžitě ukončí program s chybovým hlášením. Používám ji při testování grafiky a inicializaci hry. Proměnné
BITMAP *BackBuffer; Tyto v sobě uchovávají - BackBuffer pro Double Buffering, pozadí scény, kurzor myši a kámen nebo kolečko.
int Konec = 0; Dále Konec testuje hlavní smyčku, PocetKolecek a Uletlo složí k počínání sestřelení nebo ulétnutí kamenů a i používám kontrolu špatně vypočítaného nového kolečka. Vypis a VypisStisk slouží ke kontrole výpisu k tomu se dostanu později. Na vlastnosti o Kolečku ( kámen a kolečko je jedno a to samé ) používám tuto strukturu:
typedef struct tagKolecko { Kolecko Kolo; Kde x,y jsou souřadnice na obrazovce. Speed je rychlost kolečka a
Smer je
úhél otočení podle jednotkové kružnice. Nyní se ještě podívejme na další pomocné funkce:
Tato funkce dostane jako parametr naše kolečko a vykreslí jej na obrazovku na zvolené souřadnice.
a tato funkce nám pro změnu vygeneruje nové kolečko. Příkaz switch nám zjišťuje odkud nové kolečko vyletí. Jsou 4 možnosti a to z každé strany obrazovky přesně uprostřed. A nyní se dostáváme k jednotlivým funkcím o kterých jsem se zmínil na začátku článku. Probereme si je hezky popořadě.
Tato funkce nám zapne Allegro včetně myši a klávesnice. Nastaví graf. mód 640*480*16. Vytvoří BackBuffer, Pozadí do kterého nahraje soubor mraky.bmp z adresáře Windows. Další je inicializace kolečka a for cyklus nám do něj nakreslí několik koleček různých barev a nakonec nahrání a nastavení kurzoru myši. Po inicializaci ve funkci main(); se dostáváme do hlavní smyčky programu kde jako první voláme funkci:
Ta se nám stará o všechny vstupy od myši a klávesnice ( tedy ne o všechny, ale jen o ty co je potřeba ). Klávesa V nám zapíná a vypíná pomocné informace, ESC klávesa ukončí program a zmáčknutím levého tlačítka myši sestřelíme kolečko na obrazovce, pokud jsme na něj klikni. Pokud klikneme mimo nic se neděje. i používám na kontrolu ve funkci tick k tomu se tedy dostaneme až pak. Speed nastavím na -1, abych věděl, že kolečko bylo sestřeleno. Další funkce je tick, která se stará o přepočítání scény inicializaci nového kolečka apod.
Pomocí sin a cos vypočítá posunutí kolečka, které uběhlo za jeden frame (frame je překreslení scény a fps - frame per second je počet překreslení obrazovky za jednu vteřinu u této hry je omezovač na 50 FPS - k tomu se ale ještě dostanu). Dále překontroluji jestli není kolečko mimo obrazovku a jestli je nebo není sestřeleno. Pokud je vše OK tak vygeneruji nové kolečko a opět to zkontroluji. Proto je tak příkaz goto, i když ho používám nerad, ale v tomto případě je i efektivní. Nakonec zjistím zda není konec hry. To znamená, že hráč buď sestřelil všech 10 koleček a nebo mu jich 5 ulétlo :-). Poslední (ne úplně poslední, ale poslední v cyklu) je funkce Render(), která se postará o všechno vykreslení.
Nejdříve schová kurzor, poté smaže obrazovku, nahraje pozadí, vykreslí pomocné informace pokud jsou aktivovány klávesou V, nakreslí kolečko pomocí funkce o které již byla řeč, zobrazí na BackBuffer kurzor myší a nakonec vše plácne na obrazovku. Po opuštění cyklu se zavolá funkce GameUnInit, která se postará o odinicializaci hry. Není zapotřebí více komentovat.
A nyní se podíváme na hlavní funkci main(). Vypadá jako jsem uváděl předtím až na to, že je zde navíc funkce rest(), která je stejná jako delay(int ms); u jazyka C.
Tedy počítáme s tím, že hra poběží v 50 FPS, což je docela pěkné, ale je zapotřebí výkonný počítač. Při další hře si povíme o synchonizaci FPS na jakémkoliv stroji. Aby tedy bylo jedno zda hra beží 10 nebo 100 FPS a kámen se posouval o stejný kus. Při 10 FPS to může mít za následek tzv. trhání. Zdrojový příklad si můžete stáhnout zde. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||