Jak funguje online hra Towns [přednáška]

Zpravodajství Přednášky 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í.

Systém

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.

Náhled rozmístění stromů a skal

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ě.

Kreslená mapa

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

http://map.towns.cz

Náhodně kmitající bod

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:

Střed mapy [-200,–150] -

Kvadrant ± [2000,–1000] -

Kvadrant ++ [2000,1000] -

Kvadrant ± [20100,–20000] -

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


 

  Aktivity (2)

Zprávu pro vás napsal Pavol Hejný 19.7.2015 11:28
Avatar
Autor se věnuje vývoji mnoha www aplikací - http://pavolhejny.cz/


 

 

Komentáře

Avatar
Lako
Člen
Avatar
Lako:

To je pěkný článek.

 
Odpovědět 19.7.2015 15:22
Avatar
Tonda Kozák
Člen
Avatar
Tonda Kozák:

Hodně zajímavé.
Ty závěrečné obrázky jsem musel hodně rychle odrolovat, aby mně nevybuchly oči. :-)

 
Odpovědět 19.7.2015 21:05
Avatar
Pavol Hejný
Redaktor
Avatar
Odpovídá na Lako
Pavol Hejný:

Díky, určitě napíšu další na generování map. :)

Odpovědět  +2 22.7.2015 14:45
http://pavolhejny.cz/
Avatar
Pavol Hejný
Redaktor
Avatar
Odpovídá na Tonda Kozák
Pavol Hejný:

Díky, pak sem pošlu mapu vygenerovanou na základě těch obrázků, to už nebude tak psycho :)

Odpovědět  +1 22.7.2015 14:46
http://pavolhejny.cz/
Avatar
Tonda Kozák
Člen
Avatar
Odpovídá na Pavol Hejný
Tonda Kozák:

Super. Těším se na další článek. Na takovou přednášku bych i rád šel, bohužel jsem teď v Anglii.

 
Odpovědět 22.7.2015 17:05
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.