Zadání

Vytvořte jednopatrové bludiště s pravoúhlou sítí kostek. Bludiště by mělo přibližně vypadat jako hra Wolfenstein 3D. Rozložení stěn v bludišti bude dáno mapou načítanou ze souboru. Formát souboru je popsaný níže.

Bludištěm bude možné se volně pohybovat. Kolize se stěnou nesmí způsobovat zaseknutí či poskočení. Nesmí být možné opustit mapu i v případě, že na okraji bludiště chybí zeď, která by opuštění bránila. Není možné vstoupit či nahlédnout do zdi.

Pozorovatel se pohybuje rovnoměrnou rychlostí vzhledem ke skutečnému času, rychlost tedy není závislá na počtu FPS. Rychlost otáčení pohledu myší je závislá pouze na rychlosti pohybu myší. Pozorovatel se nemůže přetočit, tj. natáčení ve vertikálním směru lze pouze v rozsahu (-90°; +90°), kde 0° je pohled přímo vpřed.

Veškeré animace a pohyb pozorovatele jsou závislé na reálném čase, nikoliv na snímkovém kmitočtu, tj. změna doby nutné na zobrazení jednoho snímku nesmí způsobit změnu rychlosti pohybu či animace v zobrazovaném světě.

Scéna osvětlena reflektorem ze svítilny držené pozorovatelem ve výšce 2,05 m a směrovém vektoru o depresi 2°. Úhel u kořene kuželu je menší, než je úhel pohledu pozorovatele.

Výpočet počtu snímků za předchozí sekundu počínaje aktuálním snímkem, tj. počet předchozích snímků, které se vejdou do okénka o velikosti jedné sekundy.

Bludiště je charakterizováno parametry v tabulce 3, kde 1 jednotka = 1 metr.

šířka: 2 m
hloubka: 2 m
výška: 3 m
výška očí: 1,85 m
hmotnost: 95 kg
průměrná rychlost: 2,5 m/s

Jako rozšíření implementujte načítání a aplikaci textur. Na textury aplikujte různé filtry pro lepší vizuální dojem z výsledné vyrenderované scény. Můžete použít i animované textury. Animace musí být tvořena změnou obrazu, nikoliv například jen posunutím texturovacích souřadnic.

Do mapy umístěte předměty. Hráč předměty sbírá a počítá se počet sebraných předmětů, který je zobrazen na obrazovce. Předměty poskakují, točí se na místě, popř. provádějí nějaký jiný zajímavý pohyb. Rychlost pohybu předmětů je nezávislá na snímkovém kmitočtu. Předmětem bude model, který se bude načítat z disku v textovém formátu.

Bludiště opatřete zvoleným množstvím teleportů, které slouží k přenesení hráče v mapě z jednoho místa do jiného. Během teleportace bude hráči znemožněno se pohybovat a obraz přejde plynule do celé bílé obrazovky a zpět. Teleporty v bludišti vhodně označte, aby byly snadno rozpoznatelné.

Do scény přidejte osvětlení směrovým světlem (slunce, globální osvětlení) produkující phongovo stínování, tj. bez využití vertex/pixel shaderů. Světla v mapě opět vhodně vyznačte.

Implementujte jednoduchou dynamiku hráče. Postava se bude při chůzi vpřed a vzad pohupovat a tím bude simulovat kroky.

Vytvořte poloprůhlednou konzoli, která bude podobná konzoli ze hry Quake 3. Musí obsahovat minimálně 3 příkazy s dopadem na scénu.

Formát vstupního souboru s mapou

Formát vstupního souboru s mapou je textový, kde první řádka definuje šířku a výšku bludiště: W×H (např.: 32x40 = 32 sloupců široká a 40 řádků vysoká). Jeden znak je jedna kostka na mapě. Mapa je uložena po řádcích a má W sloupců a H řádek.

Význam jednotlivých znaků je pevně stanoven, viz tabulka 4. Není-li v aplikaci daný znak využit, pak je dekódován dle významu skupiny znaků do níž náleží nebo jako volný prostor. Je-li například nalezen znak 'f' (druh zdi) a aplikace nerozlišuje druhy zdí, pak je tento znak považován za zeď podobně jako znaky 'a', 'b', …, 'n'. V případě, že je nalezen znak 'O' (cizí postava) a není řešena úloha Protivník, pak je tento znak interpretován jako volný prostor dle znaku 'o'. Je-li nalezen znak '|' (volné užití), pak je tento interpretován jako volný prostor.

znak význam
mezera, 'o' až 'z' volný prostor
'*', 'a' až 'n' zeď (obecně neprůchodné pole)
'S' startovní pozice pozorovatele, vždy právě jedna
'@' světla
'A' až 'G' dveře a vstupy tajných chodeb
'H' až 'N' pevné objekty
'O' až 'R' cizí postavy (protivníci)
'T' až 'Z' předměty určené ke sběru
ASCII 32 až 127 volné použití