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++
Jednoduchá hra Auto
auto
26. dubna 2001, 00.00 | Naprogramujte si jednoduché autíčko v C++ Builderu. Nechce se vám programovat? Stáhněte si hotovou hru!
Hru s jezdícím autíčkem určitě všichni znáte z osmibitů, které dnes prachem zapadané smutně koukají ze skříní našich domovů. Stále mám pocit, že není na škodu si zavzpomínat a tuto hru si naprogramovat. Je to klasický učebnicový příklad, který stojí za to spáchat v C++ Builderu.Jak bude hra výsledně vypadat
Máme auto uprostřed obrazovky a vyhýbáme překážkám, viz. obr.
Jdeme na to
Takže na jakém principu to vlastně funguje? Cesta se skládá z políček o 12 řádcích a 12 sloupcích (0-11). Přitom 0. a 11. sloupec je krajnice. Vytvoříme si vícerozměrné pole [12][12] (nebo jednorozměrné - 144), do kterého budeme zaznamenávat informace, jestli je na něm krajnice, cesta, překážka nebo bonus. Přitom si pro každou informaci stanovíme příslušný index, podle kterého poznáme příslušný prvek na cestě. Potom podle takto připravené cesty v paměti celou situaci vykreslíme na obrazovku.
|
Autíčko má rozměry 10*10 (tvořeno 1 neanimovanou bitmapou) a pohybuje se po cestě, která je určena polem 12*12. To znamená, že potřebujeme pro zobrazení cesty plochu asi 120*120 pixelů.
Auto jede na spodním řádku (viz. obrázek)
Autíčko musíme vykreslit do místa mezi krajnice na cestu. Celá vozovka má šířku 12 políček, kde políčka 0 a 11, jak víme, jsou krajnice. Auto tedy kreslíme na políčko 1 až 10. Umístění auta na cestě popišme proměnnou pozice. Tato proměnná nám řekne, na kterém políčku zleva se autíčko právě nachází. Informace o umístění auta na cestě nám pomůže při testování, zda došlo ke srážce či nikoliv.
Na obrazovce máme zobrazenou cestu s překážkami a s autíčkem. Jak docílit toho, aby se vše pohybovalo?
V nějakém předem zvoleném intervalu obnovujeme cestu s překážkami. To znamená, že musíme měnit hodnoty v našem vytvořeném poli, kam ukládáme informace o jednotlivých políčcích. Ve zdrojovém kódu, který si můžete stáhnout, jsem toto pole pojmenoval "cesta". Abychom vytvořili dojem pohybu, musíme nejprve vygenerovat první řádek cesty. Po daném intervalu řádek zkopírujeme o řádek níž a první řádek opět vygenerujeme. Celý algoritmus pohybu cesty vypadá asi takto:
Řádků máme celkem dvanáct (indexováno 0-11). Na poslední řádek zkopírujeme předposlední, na předposlední zkopírujeme ten před ním... a tak pokračujeme až k druhému řádku. A na druhý řádek zkopírujeme první. Na první řádek už nemáme co kopírovat a tak musíme první řádek vhodně vygenerovat, aby na cestě byla i nějaká překážka. Když tento algoritmus budeme opakovat, dosáhneme efektu pohybu cesty.
Popis částí kódu
Už máme jasné, jak celý program spácháme. Takže můžeme začít kódovat.
Co k tomu budeme potřebovat? Nejdůležitější je plocha, kde budeme vyobrazovat průběh hry, k tomu bych použil komponentu Image nebo také DXdraw z palety DelphiX (tu ale musíte mít nainstalovánu). Dále potřebujeme 4 komponenty Label a jeden časovač. Vše si uspořádáme podobně jako na obrázku:
Uprostřed je komponenta DXDraw nebo Image. Ta musí mít velikost 120*120 (viz Řešení). Label s nápisem START umístěný nahoře má ve hře za úkol začít novou hru nebo zrušit hru. Jedná se o přepínač. Tuto funkci můžete podle libosti také umístit na tlačítko, je to úplně jedno.
Další Labely signalizují počet životů, body a aktuální Level. Časovač nastavíme na interval 200 milisekund a Enabled na false, aby hra po spuštění nezačala hned probíhat.
Vykreslování průběhu hry budeme realizovat do Canvasu. Canvas je vlastnost objektu Image, ale také DXDraw->Surface, proto nebude velký rozdíl v realizaci pod DelphiX.
Vykreslení cesty
|
Všimněte si vykreslení do Canvasu, vykresluje se podle řádků a sloupců a na příslušné políčko se dosazuje obrázek. Podívejme se na to, jak se dosadí na dané místo správný obrázek. Velice jednoduše. Jak jste si všimli, máme vytvořené pole obrázků Graphics::TBitmap *Obraz[5], kde nultý prvek pole je auto, druhý cesta, pak následuje krajnice, překážka a bonus. Stejné hodnoty dosazujeme do pole cesta, takže když se vykresluje dejme tomu políčko 5 z řady 1, jedná se o políčko z pole cesta[0][4], na něm je hodnota 1. Vykreslíme obrázek Obraz[1]. A tak to funguje pro všechna políčka. Makra SIRKA a DELKA určují šířku a délku jednoho políčka v pixelech.
Poznámka: Přestože mám objekt na vykreslení pojmenován Image1, jedná se v popisovaném kódu o komponentu DXDraw, proto se Canvas volá přes Image1->Surface. Hru jsem dělal ve dvou verzích, pro komponentu Image1 a pro DXDraw. Záměrně jsem komponenty v obouch verzích pojmenoval stejně, aby byly zřetelné jejich rozdíly.
Pohyb cesty
Nyní se podívejme na to jak se posunuje cesta. Cesta se zobrazuje podle pole cesta[12][12] a podle hodnot prvků tohoto pole. Takže pohyb cesty docílíme tak, že budeme vhodně měnit hodnoty jednotlivých políček. Na poslední řádek pole překopírujeme předposlední, na předposlední zase o jeden výš atd. No a zbývá jenom vymyslet nový první řádek. K tomu dobře poslouží generátor náhodných čísel.
A v kódu vypadá pohyb cesty následovně:
Nejprve překopírujeme n-1 řádek do n-tého řádku s tím, že 0 řádek necháme beze změny
|
Nový první řádek vygenerujeme pomocí náhodných čísel překážky tak, že necháme počítač vymyslet náhodné číslo (z intervalu 0 až hustota -1). Když se toto číslo rovná 5, zapíšeme na políčko hodnotu 3, tím určíme, že se zde bude nacházet překážka. Hustota překážek přitom závisí na proměnné hustota, kterou jsem zvolil optimálně 20.
A máme hotovo.
Zdrojový kód si můžete stáhnout zde: auto.zip
(C++ Builder1 - ovládání levá <; pravá >)
Novější verze auto1.zip (C++ Builder4 - ovládání šipky)
Věřím, že jste přeložili, spustili a zahráli. Takže příště se těším, že uděláme opravdovou rolovací automatovku.
-
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