Pidicraft
Download programu Pidicraft (3,8 MB)
Download příkladu uložení mapy (postavený chrám) (1 KB)
Hra Pidicraft byla inspirována hrou Minecraft, ovšem oproti původní předloze je mnohem jednodušší. Byla vytvořena jako pokus o realizaci problematiky generování nekonečného 3D světa skládajícího se pouze z kostek.
Ovládání
šipky - pohyb
myš - otáčení pohledu
levé tlačítko myši - provedení akce s předmětem
pravé tlačítko myši - zobrazení obsahu batohu
Alt+Enter - celoobrazovkový mód
Esc - konec programu
1 ... 5 - výběr nástroje
A ... O - výběr předmětu
0 - zrušení výběru
) - cheat ;-)
Recepty
Nástroj se uchopí do ruky a použije se na materiál, který je položený na zemi, výsledek se objeví v batohu.
nůž + keř -> pila
nůž + dřevo -> motyka
nůž + jíl -> pec
pila + strom -> dřevo
motyka + keř -> keř
motyka + strom -> strom
motyka + jíl -> jíl
motyka + písek -> písek
motyka + hlína -> hlína
motyka + mech -> mech
motyka + tráva -> tráva
motyka + železná ruda -> železo
motyka + železo -> železo
motyka + dřevo -> dřevo
motyka + zlato -> zlato
motyka + Petr -> Petr
krumpáč + žula -> žula
krumpáč + mramor -> mramor
krumpáč + mozaika -> mozaika
krumpáč + železná ruda -> železná ruda
krumpáč + železo -> železná ruda
krumpáč + zlatá žíla -> zlato
krumpáč + zlato -> zlatá žíla
pec + hlína -> nůž
pec + železo -> krumpáč
pec + písek -> mozaika
Popis
Svět Pidicraftu se skládá z kostek o rozměru 1x1x1. K dispozici je 14 typů kostek, 5 nástrojů, strom a keř. Svět je omezen na výšku 32 kostek, rozměr světa je 4096 x 4096 kostek.
Původní hra Minecraft je realizována v Javě s podporou 3D shaderu. Petr tuto možnost nemá a proto má hra některá technická omezení. Především - každá krychle musí být realizována jako 3D objekt Petra. Každý 3D objekt v Petrovi zabírá asi 2 KB paměti. Protože je třeba počítat s plným zaplněním prostoru krychlemi, může se paměť programu rychle zaplnit, až do omezení virtuální paměti. Proto je výška světa Pidicraftu omezena na 32 kostek a maximální dohled na 25 kostek. Při tomto omezení je možné se při maximálním zaplnění prostoru vejít do limitu virtuální paměti. Znamená to ovšem, že kostky 3D světa se vytvářejí teprve až se mají objevit v dohledu hráče a při větší vzdálenosti se opět ruší.
Pro zefektivnění renderování kostek jsou kostky shlukovány do bloků o rozměru 8x8x8 kostek (tj. 512 kostek). Díky tomu Petr může rychleji vyloučit bloky, které nejsou v pohledovém úhlu (používá hraniční koule, které ohraničují 3D objekty). Bloky jsou dále shlukovány do sloupců o výšce 32 kostek, které slouží k ukládání do souboru. Celá zobrazitelná část je organizována do minimapy o rozměru 64x64x32 kostek (tj. 8x8 sloupců). Dostane-li se hráč mimo středovou oblast mapy, sloupce na protější straně jsou zrušeny a na přilehlé straně vytvořeny nové.
Dále bylo ve hře realizováno generování náhodného nekonečného světa. Kvůli velkému rozměru není rozumné vygenerovat celý svět najednou, zabíral by při tomto rozměru 500 MB. To by při (budoucím možném) provozu přes Internet znamenalo pokaždé stáhnout 500 MB dat. Proto se svět generuje náhodně teprve až ve chvíli, kdy se hráč na určité místo dostane. Je ovšem samozřejmé, že pokud se hráč na nějakou pozici vrátí, musí ji nalézt vždy stejnou, svět nemůže být úplně náhodný aby se pokaždé změnil. Proto se ke generování používá pseudonáhodný generátor, který je odvozen od souřadnic.
Kostky ovšem nelze generovat jen čistě náhodně kdekoliv v prostoru. Je třeba je generovat tak, aby vytvářely určitý terén, shluky skal či stromů. Pro tyto účely byl použit procedurální generátor náhody Perlin Noise. Základem generátoru je šumový pseudogenerátor, jehož náhodnost je odvozena od souřadnic ve světě. Pří výpočtu procedurální náhody se vypočtou procedurální náhody v rozích jednotkového čtverce jako střední váhová hodnota sousedních míst. Náhoda se poté interpoluje zlomkovou částí. Výsledná hodnota procedurálního generátoru se pak získá jako součet několika harmonických, tj. pseudonáhody s různou frekvencí souřadnic. Takto získaná hodnota procedurální náhodnosti se používá ke generování výšky terénu a také ke generování objektů v terénu (typy kostek).
Samozřejmě hra tohoto typu je zajímavá teprve až má hráč možnost svět měnit, tedy brát a pokládat kostky. Jeho modifikace je nutné ukládat do souboru. Svět je ukládán po sloupcích. Jsou-li kostky v některém sloupci změněny, sloupec se uloží. Při načítání je pak rozlišeno, zda existuje uložená podoba sloupce a pokud ne, je sloupec vygenerován. Na začátku souboru uložení Pidicraft.map je tabulka offsetů sloupců v souboru. Pokud sloupec v souboru neexistuje, je příslušný offset nastaven na 0, jinak je sloupec uložen na daný offset. Každý sloupec zabírá 8 KB, což jsou hodnoty typů 8x8x32 kostek.
Rozšíření
Pidicraft vznikl jako experiment a proto se jeho další vylepšování nepředpokládá. Na čem by se dalo pokračovat je:
- více typů kostek a více interakcí, animované objekty
- lepší výběrové menu (ne klávesnicí, ale výběrem myší)
- zobrazení minimapy a aktuální pozice hráče na ní (je pro to uvnitř připravena funkce, která vygeneruje mapu světa do BMP)
- nějaké úvodní menu, volitelné ukládání a načítání
- podpora multiplayer, namísto ze souboru program žádá sloupce od serveru (DirectPlay nebo UDP), během modifikací klienti hlásí ostatním své změny tak, aby se hned promítly ve scéně. Namísto serveru na určité IP adrese by mohla být hlavní evidence mapy na PHP serveru, ten by evidoval IP adresy připojených online hráčů (tak se spolu mohou spojit i hráči, kteří se vůbec neznají), data by se přenášela v realtime mezi klienty, server by jen evidoval změny v mapě.
Download programu Pidicraft (3,8 MB)
Download příkladu uložení mapy (postavený chrám) (1 KB)