Jak funguje online hra Towns [přednáška]
Zde je přednáška, kterou jsem na srazu ITNetwork měl:
Omluv prosím špatnou kvalitu, byla to celkově druhá přednáška na srazu ITNetwork, první přednáškový sraz, moje první přednáška tohoto typu vůbec. A Honza poprvé natáčel přednášku na video, další videa jsou již nahrána s přídavným mikrofonem.
A zde odkaz na prezentaci:
https://prezi.com/…ca4fs/towns/
Kvůli nižší kvalitě záznamu bych rád bych napsal článek o přednášce, kterou jsem měl na 1. přednáškovém srazu ITnetwork. První část je stručné shrnutí přednášky, poté je volné pokračování na herní mapy. Přednáška se týkala vývoje real-time www strategie a jaké technické problémy řeším při vývoji hry towns.cz .
Několik základních principů, na kterých je hra postavena:
- Základem hry je mapa, na ní se vše odehrává.
- Mapa je pouze jedna. Nejsou žádné podmapy, ostrovy, servery ani jiné finty, jak mapu rozsekat.
- Hra nikdy nekončí. Celý systém neustále běží a kumuluje data.
Fungování online hry
Běžná www stránka má jednoznačné URL. Při kliknutí na odkaz prohlížeč zahodí starou stránku a načte stránku novou. Tento způsob se velmi dobře uplatňuje na webech rozsekaných na jednotlivé stránky. U hry, kde je jedna velká mapa, se dobře uplatnit nedá.
Celý systém se proto skládá ze dvou samostatných aplikací – serverové a prohlížečové.
Na serveru jsou uložena všechna data. Server komunikuje přes API se všemi klienty. Posílá aktuální informace, přijímá a kontroluje změny na mapě.
Při načtení stránky se uživateli načte celá klientská aplikace.
Klient(prohlížeč) se serverem následné komunikuje přes http API. Klient má u sebe uložený malý výsek mapy. Jakmile hráč provede nějakou akci, například postaví budovu, javascript na klientovi okamžitě zkontroluje, zda je akce možná a pokud ano, okamžitě ji postaví. Přitom akci „postav budovu“ uloží do bufferu, který se jednou za několik vteřin posílá na server. Jakmile server příkaz přijme a zkontroluje, uloží si v databázi, kde je budova postavená, a zpátky na klienta pošle změny od jiných hráčů. Ty javascript na klientovi zobrazí.
Mapa
Jedním z hlavních problémů je množství dat, které musí být na serveru uloženy a které se musí ze serveru na klienta poslat.
Pokud se ukládá každý objekt na mapě např. „Na [23.5 , 45.3] je strom typu 5“, je celý systém velmi neefektivní.
Tenhle problém se dá docela jednoduše vyřešit tím, že se přírodní objekty nebudou ukládat, ale pouze se stanoví mřížková mapa a v ní podklad pro stromy. Stromy se na mapu umisťují pouze na základě algoritmu, který jde pro dané místo vždy zopakovat se stejným výsledkem. Podobný postup můžu uplatnit na skály.
Více o tom bych rád napsal v jiném článku.
I když ale neukládám přírodní objekty jako stromy a skály, musím někde získat samotnou mřížku mapy. Způsobů, jak mapu vytvořit a posílat ze serveru na klienta je několik:
Kreslená mapa
Mapa se dá nakreslit jako obrázek. Autor ji má plně pod kontrolou, problém nastává, pokud je potřeba mapu zvětšit. Vždy sice jde dokreslit další a další ostrov, pokud se to ovšem udělá několikrát, je celý koncept mapy pokažený a mapa vypadá nezajímavě.
Další nepříjemná vlastnost je, že se ze serveru musí přenášet všechna data o tom, jak mapa vypadá.
Generovaná mapa
Jedním z algoritmů, který jsem dlouho využival je „náhodně kmitající bod“
Jak funguje + zdrojové kódy jsou zde:
http://www.itnetwork.cz/…enerator-map
Zde je jeho živá ukázka
Jeho obrovskou nevýhodu je, že po vygenerování musím celou mapu uložit terén po terénu natvrdo do databáze. Načítání takové mapy probíhá stejně jako u kreslené mapy.
Pokud bych nechtěl ukládat a přenášet všechna data o tom, jak mapa vypadá, můžu se pokusit na straně klienta zopakovat stejný algoritmus, který mapu vygeneroval na serveru.
Zde můžu využít seed - jednotlivé náhody použité v algoritmu si uložím a budu ukládat a přenášet pouze je. Tím by se množství dat potřebné k uložení mapy výrazně snížilo.
Problém je však ten, že většinou chci znát pouze malý výsek mapy, který právě prohlížím. Tímhle postupem bych však musel vygenerovat mapu celou a následně ji ořezávat. U malých map je to OK, pokud chci mít ale hru s velkou (ideálně nekonečnou) mapou, je kmitající bod nepoužitelný algoritmus.
Nekonečná mapa
Krása nekonečné mapy spočívá v tom, že jakmile jednou mapa existuje a existuje dobrý algoritmus na umisťování nových hráčů, nemusím řešit nedostatek místa na mapě.
Potíž je však v tom, jak nekonečnou mapu vyrobit. Zkoušel jsem mnoho algoritmů, všechny mi doposud kazily zásadní vady:
- Na mapě se opakuje to samé.
- Mapa je pouze nezajímavý šum.
- Na mapě je jeden zajímavý objekt, zbytek je voda, či nezajímavý šum.
Tenhle týden jsem však objevil algoritmus, který dokáže vyrobit velmi zajímavou mapu s několika příjemnými vlastnostmi:
- Mapa je nekonečná
- V každé větší části (cca 50 x 50) se nachází všechny biotopy – jezera, tráva, lesy a hory.
- Mapa není nezajímavý šum ani neustále opakovaný vzor, ale různě velké a prolínající se kruhové, eliptické a hyperbolické útvary.
- Generování mapy je na výkon velmi nenáročné.
Zde je ukázka mapy. Výseky jsou 400 x 400 políček:
-
-
-
-
Algoritmus funguje na základě počtu prvočísel, „druhočísel“, „třeťočísel“... v jednotlivých bodech. Pokud by to někoho zajímalo, můžu napsat speciální článek či udělat přednášku, jak funguje.
Jak dál?
Towns, hra, která je právě na internetu funguje, má mnoho nedostatků:
- Obrovské množství dat hru výrazně zpomaluje.
- Skutečnost, že se nejedná o opravdovou hru, ale spíše o systém, ve kterém se dají stavět města.
- Chaotické UI.
- Mnoho bugů a chyb
V následujícím období bych dal rád dohromady pár lidí, kteří by chtěli založit vlastní hru. Rád bych vytvořil novou hru (možná novou verzi Towns) s tím, že bychom se měli poučit z chyb, které kazí současné Towns.
Pokud Tě to zaujalo, můžeš se mi ozvat do zpráv, komentářů nebo na ph@towns.cz