Allegro - Tetris, nic těžkého (14. 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 - Tetris, nic těžkého (14. díl)

allegro

29. října 2002, 00.00 | V dnešním díle se po dlouhé době opět seznámíme s programováním her. Tetris jistě každý zná a na začátek se vyplatí začít s něčím jednodušším. Ale na druhou stranu težším než byla hra Střelba v 6. díle.

Poznámky autora: Naprogramoval jsem hru Kostky, což je obdoba hry Tetris, kterou vymyslel Alexev Pajitnov. Nepřináší nic moc nového je to jen prah obyčejný tetris, ale rád bych se s vámi podělil o to jak jsem ho naprogramoval a jakou techniku použil.

Od posledního dílu uplynulo již několik týdnů a je ten správný čas si všechno vyzkoušet pořádně v praxi a o tom bude dnešní článek. V jednom článku na Builderu jsem četl, že je dobré začít programováním Tetrisu. Tuto zajímavou myšlenku jsem se dočetl v článku Jak se vytvářejí hry? :o).
V dnešním článku udělám výjimku a to takovou, že zdrojový soubor nechám stáhnout již na začátku článku protože se na něj budu v průběhu často obracet a popisovat jej. Stáhnout si ho tedy můžete zde.

Tento seriál je o programování grafické knihovny Allegro, ale k čemu nám je grafika či knihovna, když nevíme jak něco naprogramovat? Když vlastně neznáme programátorské "oříšky" ? A proto bych si dnes popovídal o tom jak takový Tetris vlastně naprogramovat. Předem říkám, že to není nic těžkého, ale na druhou stranu nejlehčí to taky není. Alespoň tedy pro začínající programátory. Nejhorší asi je, když už začneme něco takového programovat, to dotáhnout do konce!

Na jakém principu hra funguje?

Na začátek bych rád připomenul, že způsobu programování je více, ale já se zde budu zabývat pouze tím, který jsem použil pro programování já. Co je potřeba úplně na začátku? To je dvourozměrná matice nebo-li dvourozměrné pole. Jako první je čas se rozhodnout jak budou jednotlivé kostky v poli reprezentovány. Já jsem například použil pole typu int. Takže definice by mohla vypadat následovně:

int HraciPole[20][10];

Pro velikost jsem použil šířku 10 a výšku 20 políček v poli. Hrací pole bude tedy "hubený" a "vysoký" obdélník. Dál je potřeba si definovat jak budou vypadat jednotlivé kostky. Můžeme například použít čtyř-rozměrné pole, které vypadá následovně:

int Kostky[6][4][4][4];

Kde je potřeba definovat i s přiřazením. Jednotlivé položky mají tento význam. Zleva doprava. 6 je druhů kostek ve hře. 4 jsou otočení kostky, tedy nahoru, doleva, doprava a dolů. 4 * 4 je pole jedné kostky v nějakém otočení. Tedy například:

{1,1,1,1},
{0,0,0,0},
{0,0,0,0},
{0,0,0,0}

Tento zápis (i když není zcela správný, protože to je jen ukázka a musel by být doplněn středníkem, konktrétně do pole atd.) vyznačuje kostku v otočení např. doprava dlouhou čtyři políčka a širokou jedno políčko. Určitě ji všichni znáte z hraní Tetrisu jak na počítači tak možná i na digihře.

A teď opravdu jak to celé funguje?

Ještě předtím mi dovolte několik informací o zdrojovém souboru hry a pak už Vás provedu jednotlivými funkcemi.

Ve hře je potřeba mít spoustu informací a ukládat je v proměnných. Tedy  např.:

Proměnné pro chod hry:
-velikost hracího pole
-velikost kostky
-aktuální informace o kostkách (ta která padá a další)

Proměnné pro uživatele:
-ve hře je také možné počítat Score, počet kostek, který hráč zdolal apod.

a tak dále...

Rozložení zdrojového kódu v souboru
Bylo by dobré si otevřít zdrojový soubor a na všechno se v průběhu článku hned dívat.

Na začátku jsou údaje o verzi hry, o začátku a konci práce, o tom kdo hru naprogramoval a hlavně jednotlivé verze hry, které se psali při programování hry. Abych tedy věděl zda už jsem tu či onu funkci udělal nebo ne. Ze začátku si člověk říká je to zbytečný psát nějaký komentáře, ale na konci to ocení a i teď po půl roce se ve zdrojáku stále vyznám.

Jak tedy celý soubor funguje nebo spíše celá hra funguje?

Na to se právě nyní podíváme. Funkce main je v programu jako poslední, která se za prvé spustí jako první po spuštění programu a za druhé je v ní smyčka menu, která se točí pořád dokola a chová se podle vstupů z klávesnice od uživatele. Jen se na ní podívejte, je docela dlouhá :-) Měla by být možná i kratší, ale funguje to :) Taky dobré ponaučení, které jsem někde četl na internetu zní: "Nejdříve program zprovozni a pak ho můžeš ladit!".

Ještě před vstupem do smyčky se spustí funkce Intro, která se obstará o úvodní animaci hry, ve které je další funkce Anim, která tu vlastní animaci tvoří. To celé je jen jako oříšek pro zpestření hry. Aby to nebyla taková nuda :)

Nyní přejdu rovnou k samotné hře. Položka MenuAktive je proměnná která v sobě uchovává hodnotu aktuálního menu ve hře. Například nová hra, nejlepší hráči, konec atd. Pokud odENTERujeme tuto položku dostaneme se do funkce PlayGame (omlouvám se za anglické názvy, ale nějak to střídám CZ / EN), která se postará již o samotnou hru.

Hned po spuštění se zavolá funkce NewGameInit, která nastaví všechny potřebné informace nebo spíše proměnné. Ty jsme zmiňovali již před chvílí, jako vynulování score atd. Dále je zde smyčka, která slouží k průběhu hry a ukončí se pouze koncem hry nebo uživatelským koncem hry - tedy klávesou ESCape.

Celá hra je rozdělena na tři funkce. Přesně jak tomu bylo v minulé hře a to v šestém díle o Allegru, kde jsme poprvé tvořili hru se jménem Střelba.

1) vstup od uživatele, např. z klávesnice
2) výpočet scény
3) vykreslení na obrazovku

O první položku se stará funkce Input(), která kontroluje všechny vstupy z klávesnice, které se dají použít při hře. 

O druhou položku se stará funkce RenderScene(), která vypočítá jak bude vypadat další obrazovka. Ta v sobě navíc ještě volá další funkce jako např. KresliHraciPole(); nebo KresliDalsiKostku(); - obě tyto funkce zapisují do bufferu. Používá se Double Buffering a jméno proměnné je BB. V této funkci se vypisují i texty, které jsou kolem hracího pole. Samozřejmě nesmíme zapomenout ani na Score.

A o poslední položku se stará funkce FlipToScreen, která obsahuje pouze jenom jeden příkaz a to:

blit(BB, screen, 0,0,0,0,SCREEN_W,SCREEN_H);

Jak vidíte pouze překopíruje BB na aktuální obrazovku.

Vraťme se ale nyní k tomu jak funguje takový jednoduchý Tetris. V čem, že to vlastně vězí? Něco už jsme nakousli na začátku a nyní to dokončíme.

Na začátku jsme si řekli, že máme pole 10*20 položek a kostička má 4*4 čtverečky. Hra probíhá tak, že máme v několika proměnných uložený tyto hodnoty: pozici levého horního rohu naší aktuální kostky (x,y), šířku a výšku kostky. Pokud se opět vrátíme na začátek vypadaly by hodnoty šířka 4 a výška 1. Aktuální kostku pouštíme do pole na souřadnicích 3,0 nebo 3,19 podle toho zda počítáme druhou souřadnici shora nebo zdola. První souřadnice je 3, aby kostička byla uprostřed. Více demonstruje následující obrázek. Na obrázku je kostka otočená o 90 stupňů.

Před tím než kostičku posuneme o jedno dolů např. po 200 ms se musíme podívat (zkontrolovat), zda již není místo kam chceme kostičku posunout obsazené. Dejme tomu, že prázdné políčko má hodnotu 0 a plné jedna. To znamená, že když posunujeme kostičku, musíme "pouze" zkontrolovat ty políčka, která mají hodnotu 1 zda na desce už není náhodou taky 1. Pokud ano, kostičku necháme na pokoji a jde se opět od začátku to samé. Kontrolovat musíme i stěny, pokud pohybujeme kostkou doprava nebo doleva pomocí šipek. 

Celý proces vypadá asi takto:

1) nová kostka?
2) můžeme položit?
3) pokud ano jedem dále a pokud ne tak je konec hry
4) čekáme až uběhne 200 ms nebo něco podobného
5) můžeme kostku posunout o jednu dolů?
6) pokud ano jeden dále a pokud ne necháme kostku na místě a zpět na bod jedna
7) jdeme na bod 4

Tímto bych dnešní článek ukončil a příště budeme pokračovat dále v Allegru.Doufám, že Vám zdrojový kód pomohl. Připomínám, že je potřeba si ho projít a ne jen otevřít ;-).

Download výsledné hry
Zde

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » C/C++  

 

 

 

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

 

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

Uživatelské jméno:

Heslo: