|
[Grafika]
[WebTip]
[Fotografování]
[Galerie]
[MujMac]
[Printing]
|
|||||||||
|
|
||||||||||
|
|
|||||||||
|
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 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? 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. 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 ;-).
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||