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 - Jednoduchá hra Střelba (6. díl)
30. ledna 2002, 00.00 | Dnešní článek nás už konečně seznámí s nějakou hrou, kterou jsme schopni v Allegru vytvořit.
Je to opravdu jen to zakladní a později se vrhneme na opravdovou hru!
Na úvod
Než 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í her
Hlavní 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řelba
Nejjednodušší 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é
Nyní na to jaké používám ve hře globální proměnné.
BITMAP *BackBuffer;
BITMAP *Pozadi;
BITMAP *MouseSprite;
BITMAP *KoleckoSprite;
Tyto v sobě uchovávají - BackBuffer pro Double Buffering, pozadí scény, kurzor myši a kámen nebo kolečko.
int Konec = 0;
int PocetKolecek = 10, Uletlo = 0;
int i = 1, Vypis = 0, VypisStisk;
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 {
int x;
int y;
int Speed;
double Smer;
} Kolecko;
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.
Kolo je proměnná typu Kolečko, které lítá po obrazovce.
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.
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