21. Pozor, padá hvězda! <<< Obsah >>> 23. Lovíme minotaury (2. část, ovládání)
Tak trochu se vrátíme k našemu oblíbenému bludišti, které jsme vytvářeli v políčkové grafice. Tentokrát ale v plně 3D. A s lepšími příšerami.
Založte si nový program, Bludiště 3D. Ze všeho nejdříve budeme potřebovat návrh bludiště. Využijeme opět políčkovou grafiku a plochu, která je na návrhy scén jako ušitá.
Připravte si nějaké textury, které použijete k vytvoření zdí, podlahy a stropu. Můžete použít ty, co jsou na konci lekce. Každé políčko bude tvořit 1 čtvercovou plochu s rozměry 1 x 1 a s vlastní texturou. Textury použijte o velikosti 256 x 256 bodů (tj. 8 x 8 políček). Pro všechny textury budeme používat vyhlazení textur stupně 2. Tím se sice všechny textury zredukují na rozměr 128 x 128 bodů, ale vyhladí se tím artefakty vzniklé převodem True Color textur do 256 barev, které používá Petr. Díky tomu, že převody proběhly s ditheringem, vzniknou po zmenšení opět textury v True Color.
Pro každou texturu zdi si připravte jeden předmět s obrázkem zdi. Předměty použijte k návrhu bludiště. Každé políčko pro zeď bude nahrazeno blokem až 4 stěn se stejnou texturou. Prázdné políčko překreslete obrázkem podlahy. Návrh by mohl vypadat například takto:
Program zahájíme klasicky skupinou inicializace programu a příkazem pro inicializací 3D grafiky. V programu budeme používat vyhlazení textur 2, proto můžeme tento příkaz uvést už na začátku programu. Výsledkem bude hra běžící v celoobrazovkovém režimu, proto připravíme příkaz celoobrazovkový režim, který zajistí přepnutí. Zatím ho však necháme vypnutý (tlačítkem Vypnout), protože přepínání videomódu chvíli trvá a navíc může mít za následek rozhození rozměrů některých oken, proto raději program vyvíjíme v oknovém režimu.
Dále si připravíme prázdnou funkci vytvoření 3D bludiště a nakonec hlavní smyčku programu ukončovanou stiskem klávesy Esc. Protože se bude jednat o 3D hru v celoobrazovkovém režimu, můžeme si dovolit ji preferovat před ostatními aplikacemi, zvolíme proto časovač s časem 0. Tím zajistíme maximální plynulost chodu hry.
Přejdeme k obsluze vytváření bludiště. Vytvoříme jenom ty plochy, které bychom mohli vidět z průchozího políčka. Proto projdeme postupně všechna políčka plochy a pokud narazíme na prázdné (průchozí) políčko, vytvoříme podlahu a strop. Pak testujeme sousední políčka a není-li na nich prázdné políčko, vytvoříme tam příslušnou zeď.
K procházení políček plochy využijeme Petra. Vypneme jeho viditelnost (nepotřebujeme aby byl animovaný, stejně ho ve 3D nevidíme) a nastavíme řádek na 0 a směr doprava. Pak procházíme postupně všechny řádky a pozice plochy a testujeme, zda jsme narazili na průchodné políčko.
Narazíme-li na prázdné (průchodné) políčko, ze všeho nejdříve vytvoříme podlahu. Jenom z toho prostého důvodu, že ji můžeme snadno vidět během ladění. Podlaha bude objekt stěny (který je tvořen dvěma pravoúhlými trojúhelníky). Stěna se vytvoří jako stojící, otočená přední stranou směrem k nám (my se díváme směrem kladné osy Z). Proto ji rotací podle osy X o 90 stupňů položíme na zem. Poté ji nastavíme na souřadnice shodné se souřadnicemi Petra. S tím ovšem, že v našem 3D světě používáme osu Y směrem vzhůru a osu Z směrem od nás vpřed. Zatímco na plochu se díváme pohledem shora. Proto nastavíme souřadnici Z stěny podle souřadnice Y Petra. Stěna má rozměr 1 x 1, proto stěny můžeme jednoduše skládat vedle sebe podle políčkových souřadnic, které se také liší o 1. U 3D objektů je nula souřadnic ve středu objektu, proto přičteme k souřadnicím 0.5, aby podlaha ležela v intervalu souřadnic 0 až 1. Se stěnami bludiště nebudeme v budoucnu už nijak manipulovat, proto si jejich ID nebudeme uchovávat a můžeme tedy použít pro všechny stěny jednu společnou proměnnou pomocné ID, kterou si vytvoříme jenom dočasně v lokálních proměnných funkce.
Abychom mohli vyzkoušet, jak nám funguje vytváření podlahy, musíme si nejdříve posunout kameru na pozici, ze které bludiště dobře uvidíme. Kamera je také jeden z objektů, má číslo 1. Vyberte ji jako aktivní objekt. Nastavením souřadnice X na 10 ji posunume do středu bludiště. Nastavením souřadnice Y na 18 ji posuneme tak nějak přiměřeně nahoru (hodnotu jsme zjistili zkusmo). Nastavením souřadnice Z na -6 couvneme trochu dozadu, to abychom viděli celé bludiště. No a nakonec nastavením rotace X na hodnotu 1 sklopíme svůj pohled trochu dolů. Hodnota byla stanovena opět zkusmo. Je to v radiánech, takže by to bylo asi tak 52 stupňů.
Když teď program spustíte, měli byste vidět vytvořená prázdná políčka bludiště (podlaha).
Strop vytvoříme podobně jako podlahu. Proto zkopírujeme skupinu pro vytvoření podlahy a jenom ji pozměníme. Rotaci podle osy X musíme dělat obráceným směrem, proto namísto 90 stupňů použijeme úhel 270 stupňů. Podlaha byla ve výšce 0, zatímco strop bude ve výšce 1. Proto nastavíme souřadnici Y na 1. Nakonec přidáme malou svítivost povrchu stropu, protože je osvětlený shora a byl by jinak příliš tmavý.
Abychom vytvořený strop viděli, stačí jen abychom změnili znaménko souřadnice Y kamery na -18 a znaménko rotace podle osy X na -1. Při spuštění bychom měli vidět strop, který je podobný zrcadlově otočené podlaze.
Při vytváření stěn budeme testovat sousední políčka. Nejedná-li se o prázné (průchozí) políčko, vytvoříme před sebou zeď. Texturu nastavíme podle obsahu políčka. Pro zeď 1 zvolíme větev jinak proveď příkazy, která zahrne nejen políčko pro zeď 1, ale také okraj plochy. Zeď otočíme správným směrem podle aktuálního směru otočení Petra a posuneme na správnou pozici, opět výpočtem ze souřadnic Petra a směru otočení. Nastavením souřadnice Y na 0.5 zajistíme správnou výšku zdi nad zemí. U 3D objektů se souřadnice nastavují pro střed objektu. Podlaha má Y souřadnici 0, strop 1 a proto zeď bude mít 0.5. Na závěr nastavíme viditelnost pro obě strany stěny - to je jen pro ladicí účely, až bludiště vyzkoušíme, tak příkaz opět zrušíme.
Po spuštění by měly být vidět zdi kolem cest. Nezapomeňte ale ještě nejdříve vrátit kameru na kladnou souřadnici Y (18) a rotaci X na 1.
A po zrušení příkazu pro viditelnost obou stran vidíme pouze správné strany zdí.
.... pokračování příště
21. Pozor, padá hvězda! <<< Obsah >>> 23. Lovíme minotaury (2. část, ovládání)