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 - Vektory a synchronizace scény (11. díl)
21. března 2002, 00.00 | Dnešní díl nás seznámí s vektory jak z matematiky tak z knihovny STL v C++. Povíme si o synchonizaci scény na jakém koliv počítači a vše si ukážeme na pěkném demu.
Pro dnešní díl je potřeba se trochu seznámit s vektory. Opravdu to nebude nic těžkého a každý by to měl pochopit pokud ještě neví co to vektory jsou. Nebudu přímo vysvětlovat matematické vektory, abych Vás zbytečně nezatěžoval, ale seznámím Vás s principem - jak udělat, aby se mi obrázek na obrazovce posouval o stejný kus a nezáleželo na tom jak rychlý mám počítač?
Nejlepší je vše si vysvětlit opět na příkladu. Vytvořil jsem jednoduché demo, které vidíte na obrázku.
Pohybují se na obrazovce čtverečky a odrážejí se od stěn. Program taky ukazuje počet čtverečků na obrazovce a FPS.
Ovládání
SPACE - přidá jeden čtvereček
ENTER - odebere jeden čtvereček
INSERT - přidá sto čtverečků
DELETE - smaže všechny čtevečky
ESC - konec
Doporučuji si nejdříve stáhnout ukázkový příklad zde, pustit si ho a malinko mrknout na zdroják, bude se vám pak dnešní článek lépe chápat. Nezapomeňte si správně nastavit v programu cestu k obrázku. To by se Vám objevila jenom černá obrazovka.
Jak je to řešeno programově?
Na souřadnice jednotlivých čtverečků používám objekty ( class z C++, už o tom byla zmínka, že to jednou přijde :) ) a na dynamické pole objektů jsem si vypůjčil vector z knihovny STL. Ale nemějte strach, nepoužívám v programu žádné "vychytávky" a snažil jsem se ho napsat co možná nejjednodušeji. Nemusíte mít strach vše je vysvětleno.
V programu používám dva časovače popsané v minulém díle. První na výpočet FPS a druhý na ty vektory.
Vektory (pouze 2D)
Abych nemluvil do větru tak nejdřív si povíme něco málo o našem objektu, který jsem nazval CObject.
|
Private proměnné nejsou z důvodu, abych nemusel psát funkce na vrácení x, y, cx a cy a proto je vše public. Proměnné x, y jsou pozice obrázku nebo čtverečku na obrazovce. cx a cy je vektor. Např. cx=cy=50 to znamená, že se obrázek za jednu vteřinu posune o 50 pixelů doleva a dolů.
Konstruktor a destruktor jsou bez funkce. Funkce (nebo lépe metoda) Init se nám postará o inicializaci náhodných souřadnic a náhodného směru a rychlosti objektu. Je volána vždy při vytvoření nového objektu.
Než si popíšeme metodu Move tak nejdřív vysvětlím jaká je finta v
programu a proč tomu říkám vektory (teď nemyslím vector z STL). Jak jsem před
chvílí zmínil tak např. cx znamená velikost posunutí za 1s. Nyní, ale co
když demo běží jednou 50 FPS a podruhé 150 FPS co pak?
Jako první si zjistíme kolik uběhlo času od posledního vykreslení scény
na obrazovku. K tomu nám slouží druhý časovač.
Rovnice na vypočítání posunuti.
cx=50 a představme si, že hra běží pouze 2 FPS. Tedy uběhlo od posledního vykreslení 500 ms = 1/2 s. V proměnné cas tedy máme hodnotu 500, protože jsme časovač pustili na volání po každé milisekundě. Podělíme tedy cas/1000 a dostaneme jakoby část vektoru, o který se máme posunout. Tedy o 0,5cx. A když hra beží 2 FPS tak nám vyjde, že cx=2*(0,5cx) a to je pravda.
Pro obě souřadnice vypadá výpočet takto:
posunutí x =cx*(cas/1000);posunutí y =cy*(cas/1000);
To pak přičteme k x a k y. S tím, že cx nebo cy může být i záporné číslo. A pomocí tohoto přepočtu nám nezáleží na velikosti FPS v programu a čtverečky se budou posouvat o stejný kus.
Metoda Move dostane jako parametr čas, který uběhl od posledního volání této funkce a vypočítá posunutí. Pak zkontroluje jestli čtvereček není mimo scénu a pokud je obrátí vektor. Např. x vyjde -5 tak nastavíme x na 0 a vektor, který mohl být cx=-35 převrátíme na cx=-cx tedy cx=35 a tím dosáhneme efektu odražení.
To by bylo k vektorům nebo posunům nebo synchronizaci scény vše. Toto se používá už dlouho a samozřejmě dodnes ve hrách jenom je to o trochu složitější a to ještě díky tomu, že se objevujeme ve 3D prostoru. Malinko si popíšeme samotný program.
Jako dynamické pole používám šablonu vector z STL ( moje oblíbená :-D )
vector<CObject> v;//nas vektor pro dynamicky seznamCObject objPrac;//pracovni objekt pro pridavani do vektoru
v je tedy naše proměnná pro práci s polem a objPrac je pomocná proměnná, kterou přidáváme další objekty do dynamického pole.
Před samotnou smyčkou programu si vytvoříme alespoň 10 čteverčů, aby obrazovka nebyla po spuštění prázdná.
|
Tedy v našem pracovním objektu objPrac zavoláme metodu Init, která vytvoří náhodný objekt (souřadnice a vektor) a pak už jenom pomocí metody vectoru push_back přidáme nový prvek na konec pole.
V samotné smyčce programu vykreslujeme v cyklu všechny prvky pomocí této smyčky.
|
Nejdříve tedy prvek posuneme a pak vykreslíme.
Pak program umožňuje několik málo funkcí s objekty jako je přidání a odnětí.
|
Tělo podmínky pro SPACE je stejné jako u inicializace.
ENTER místo push_back
volá pop_back což je odstranění prvku ze seznamu, který je na
konci.
DELETE vymaže celý
seznam metodou erase. Ta má dvě varianty buď maže nejáký prvek nebo
nekolik prvků za sebou. My volíme variantu číslo dvě a tedy chceme vymazat
celý seznam a proto voláme begin() což je adresa začátku a end() což je
konec seznamu ve vectoru. Metody begin a end vracejí interator. Ale myslím, že
pokud se o toto téma zajímáte tam na tomto serveru vychází ještě seriál o
C++
včetně STL (Standard Template Library), ale na druhou stranu jsem nepoužil nic co by se nedalo z příkladu
pochopit. Tím myslím, že pro dnešní příklad jste ani vectory nemuseli znát
a vše vám bylo jasné, protože nepoužívám žádné programátorské bombónky
a navíc dynamické pole se dájí obejít přes lineární seznam, kde v objektu
je pointer na další objekt stejného typu, což se používalo převážně v C, ale někdy i v
C++. Ale vectory jsou lepší a ušetří Vám práci a hlavně
nervy.
A jako poslední je INSERT, který přídá 100 prvků do seznamu za
sebou v cyklu.
Nakonec v programu následuje odinicializace a vrácení běhu operačnímu systému.
Vím, že program o 200 řádcích se dá jen těžce vysvětlit, ale snažil jsem se dávat všude komentáře a tak doufám, že jste všechno pochopili.
PS: Doufám, že jsem Vás vectorem z STL a třídou class moc nepřekvapil ;-).
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