Synopsa hry na hranie rolí „Hra na sladké kaviarne: „Vezmi si hudobnú stoličku“
Svetlana Furshtakova Synopsa hry na hranie rolí v strednej skupine "Kaviareň" 1. Úlohy: 1. Pokračovať v oboznamovaní detí s ...
V tomto článku vás naučím vytvárať úrovne pre hry takmer akéhokoľvek žánru a výrazne zjednodušiť ich vývoj. Vytvoríme dlaždicový mapový engine, ktorý môžete použiť vo svojich projektoch. Budeme používať Haxe a OpenFL, ale proces vytvárania je podobný pre mnohé jazyky.
Trochu o tom, čo bude popísané v článku
Myslím si, že s hľadaním dlaždíc by nemali byť žiadne problémy, takže sa tomu nebudem podrobne venovať.
Po výbere programu môžete začať experimentovať s vlastnými dlaždicami. Keďže tento článok vám ukáže, ako si vytvoriť svoj vlastný grafický engine dlaždíc, nebudem sa rozpisovať o samotných dlaždiciach.
Keď sú všetky vaše dlaždice v priečinku aktív projektu, môžete napísať jednoduchú triedu dlaždice. Tu je príklad v Hax
import flash.display.Sprite; import flash.display.Bitmap; importovať openfl.Aktíva; class Tile rozširuje Sprite ( private var image:Bitmap; public function new() ( super(); image = new Bitmap(Assets.getBitmapData("assets/grassLeftBlock.png")); addChild(image); ) )
Práve teraz všetko, čo robíme, je umiestnenie dlaždice na obrazovku. Jediná vec, ktorú trieda robí, je importovať obrázok z priečinka aktív a pridať ho ako podriadený objekt. Ako bude táto trieda vyzerať, veľmi závisí od programovacieho jazyka, ktorý používate.
Teraz, keď máme triedu Tile, musíme vytvoriť inštanciu Tile a pridať ju do našej hlavnej triedy.
import flash.display.Sprite; import flash.events.Event; import flash.Lib; class Main rozširuje Sprite ( public function new() ( super(); var tile = new Tile(); addChild(tile); ) verejná statická funkcia main() ( Lib.current.addChild(new Main()); ) )
Trieda Main vytvorí pri volaní konštruktora nový objekt Tile a pridá ho do zoznamu zobrazení.
Po spustení hry sa zavolá funkcia main() a na scénu sa pridá nový objekt typu Main. Upozorňujeme, že váš nová dlažba sa zobrazí v ľavom hornom rohu obrazovky.
Máme na výber: použiť bežné pole alebo maticu. Ak sa v maticách nevyznáte, tak vedzte, že ide o pole, ktoré obsahuje viac polí. Väčšina programovacích jazykov to predstavuje nameOfArray[x][y].
Používame X a Y ako súradnice na obrazovke. Možno môžeme použiť tieto X a Y na zobrazenie našich dlaždíc? Poďme sa teda pozrieť na maticu
private var exampleArr = [ , , , ,
Všimnite si, že nulový prvok v tomto poli je pole piatich čísel. To znamená, že najskôr dostanete prvok y a potom x. Ak sa pokúsite vziať prvok, získate prístup k šiestej dlaždici.
Ak nerozumiete, ako matice fungujú, netrápte sa. V tomto článku použijem bežné pole na zjednodušenie našej úlohy.
private var exampleArr = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0];
Vyššie uvedený príklad ukazuje, že používanie bežného poľa je oveľa jednoduchšie. Konkrétny prvok môžeme zobraziť výpočtom súradníc pomocou jednoduchého vzorca.
Teraz napíšme kód, ktorý vytvorí naše pole. Vyplňte ho číslom 1. Číslo jeden bude znamenať ID našej prvej dlaždice.
Na uloženie poľa musíme vytvoriť premennú v triede Main.
súkromná mapa var:Array
Môže to vyzerať trochu zvláštne, tak to vysvetlím.
Názov premennej je map a typ je Array. znamená, že pole obsahuje čísla.
Teraz pridajte nejaký kód do nášho konštruktora triedy na inicializáciu našej mapy.
mapa = nové pole
Tento úryvok vytvorí prázdne pole, ktoré čoskoro vyplníme. Najprv však deklarujme niekoľko premenných, ktoré nám pomôžu s matematikou.
public static var TILE_WIDTH = 60; public static var TILE_HEIGHT = 60; public static var SCREEN_WIDTH = 600; public static var SCREEN_HEIGHT = 360;
Tieto premenné sú verejné statické, aby sme k nim mali prístup odkiaľkoľvek v našom programe. Možno ste si všimli, že na základe týchto čísel sa rozhodneme, koľko buniek do poľa uložíme.
var w = Std.int(ŠÍRKA_OBRAZOVKY / ŠÍRKA_DLAŽDICE); var h = Std.int(SCREEN_HEIGHT / TILE_HEIGHT); pre (i v 0...š * v) ( mapa[i] = 1 )
Tu nastavujeme w na 10 a h na 6, ako som povedal. Ďalej musíme prejsť cez pole, aby sa zmestilo 10 * 6 čísel.
Teraz máme jednoduchú mapu, ale musíme správne usporiadať dlaždice, nie? Aby sme to urobili, vráťme sa do triedy Tile a vytvorte funkciu, ktorá nám to umožňuje.
verejná funkcia setLoc(x:Int, y:Int) ( image.x = x * Main.TILE_WIDTH; image.y = y * Main.TILE_HEIGHT; )
Keď zavoláme funkciu setLoc(), odovzdávame súradnice x a y. Funkcia prevezme tieto hodnoty a prevedie ich na súradnice pixelov vynásobením TILE_WIDTH a TILE_HEIGHT
Zostáva už len popísať v triede Main proces vytvárania a umiestňovania dlaždíc na mape
for (i in 0...map.length) ( var tile = new Tile(); var x = i % w; var y = Math.floor(i / w); tile.setLoc(x, y); addChild (dlaždica); )
Áno! Všetko je správne. Obrazovka je vyplnená dlaždicami. Poďme pochopiť, čo sa deje vyššie
Vypočítame x tak, že mu dáme zvyšok i delený w . Toto sa robí s cieľom vrátiť hodnotu x 0 na začiatku každého riadku.
Pre y berieme floor() z i / w.
Nakoniec by som rád povedal niečo o posúvaní úrovní. Zvyčajne nebudete môcť vytvoriť úroveň, ktorá sa úplne zmestí na obrazovku. Vaše mapy budú výrazne väčšie ako obrazovka, takže nie je potrebné kresliť tú časť mapy, ktorú používateľ nevidí. To sa dá opraviť pomocou rovnakej matematiky. Musíte zvážiť, ktoré dlaždice budú na obrazovke viditeľné a ktoré nie.
Napríklad: Obrazovka je 500x500 a dlaždice sú 100x100 a váš svet je 1000x1000. Pred vykreslením dlaždice musíte vykonať jednoduchú kontrolu.
Nám ostáva už len vytvárať rôzne druhy obkladov a vystavovať niečo pekné.
Vráťme sa ku konštruktoru triedy Main a upravme našu slučku
for (i in 0...map.length) ( var tile = new Tile(map[i]); var x = i % w; var y = Math.floor(i / w); tile.setLoc(x, y); addChild(dlaždica); )
Jedinou zmenou je, že teraz odovzdávame typ bloku konštruktorovi. Ak by ste sa pokúsili spustiť program bez tejto úpravy, pred spustením by zlyhal.
Teraz všetko zapadlo na svoje miesto, ale namiesto toho, aby ste ju vyplnili náhodnými blokmi, musíte prísť s návrhom mapy. Najprv odstráňte slučku v hlavnom konštruktore, ktorá vypĺňa pole jednotkami. A potom vytvorte mapu manuálne
mapa = [ 0, 4, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 6 , 0, 0, 0, 0, 0, 0, 1, 2, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 3];
Ak naformátujete pole, ako som to urobil ja, ľahko uvidíte približný vzhľad úrovne. Ale nikto vám nezakazuje vraziť pole len do jedného riadku.
Keď spustíte program, uvidíte niekoľko chýb. Problém je v tom, že naša mapa obsahuje typ nulového bloku, ktorý nemá obrázok a naša trieda jednoducho nevie, čo s ním robiť. Napravme toto nedorozumenie
if (obrazok != null) addChild(obrazok);
Táto krátka kontrola nás zachráni pred nepríjemnou chybou nulového ukazovateľa. Naposledy zmenené ovplyvní funkciu setLoc(). Snažíme sa použiť premenné x a y, ktoré neboli inicializované
verejná funkcia setLoc(x:Int, y:Int) ( if (image != null) ( image.x = x * Main.TILE_WIDTH; image.y = y * Main.TILE_HEIGHT; ) )
Vďaka týmto dvom jednoduché podmienky Teraz môžete spustiť hru a zobraziť jednoduchú úroveň. Dlaždice, ktoré majú id 0 vnímame ako prázdny priestor. Pridajte nejaké pozadie. aby to vyzeralo atraktívnejšie.
Vytvárajte mapy
Každá mapa je pole, ktoré špecifikuje umiestnenie dlaždíc na svojich vrstvách, ako aj ich parametre. Najviac jednoduchá mapa je matica MxN, kde každý jej prvok obsahuje číslo dlaždice z podmienene akceptovanej sekvencie. Ak ste niekedy používali 2D stratégiu alebo editor máp RPG (alebo ste pracovali vo Photoshope), podstatu ľahko pochopíte. Kedy Rovnaké dlaždice sa môžu líšiť vo výške,
pri použití základnej metódy. pridávajú sa nové vrstvy, matica sa stáva zložitejšou, získava sa množina (štruktúra) matíc a zavedením akýchkoľvek efektov sa získava vlastný formát mapy, ktorý na disku zaberá viac ako jeden megabajt.
Dlaždice nemusia mať poradové čísla. Naopak, na začiatok by bolo dobré rozložiť si celý číselný rad na niekoľko intervalov. Napríklad rozsah od 0 do 63 zahŕňa bežné dlaždice, po ktorých môžete chodiť (zem, dosky). Od 63 do 127 - nepreniknuteľné húštiny džungle, steny a iné pevné predmety. Ďalším intervalom sú vody jazier a močiarov a nakoniec špeciálne skupiny, ktoré vykonávajú akúkoľvek akciu, keď na ne hrdina „vstúpi“: portály, pasce atď. Teraz, keď Photoshop produkuje grafiku, prideľujete čísla začiatočníkom na základe prijatých pravidiel a v budúcnosti ste oslobodení od mnohých problémov spojených s určovaním priechodnosti stránky alebo ako reagovať, keď hrdina vstúpil na portál.
Pri kreslení mapy môžete mať spočiatku problémy s kreslením izometrických dlaždíc, pretože sú také „zakrivené“, že nie je jasné, kde nakresliť jednu a pokračovať druhú. Ťažkosti môžu nastať pri programovaní plynulého rolovania alebo orezania oblastí mapy. Mimochodom, veľkosti dlaždíc sa najlepšie vykonávajú v akejkoľvek mocnine dvoch (16x16 alebo 32x32), čo vám aj procesoru veľmi pomôže pri výpočtoch. To isté platí pre veľkosť mapy. Mal by byť čo najviac štvorcový a deliteľný veľkosťou jednotlivých „tehál“. Pri výpočte teda nikdy nebudete mať zlomkové hodnoty, s ktorými sa nedá pracovať. Preto má väčšina máp veľkosť 128 x 128 alebo 512 x 512.
Mimochodom, pohyb postáv na izometrickej mape sa tiež deje z nejakého dôvodu. Naša mapa je totiž otočená „hlboko“ a jej absolútna veľkosť vertikálne je dvakrát menšia ako horizontálna. Preto sa každý chodiaci predmet musí pohybovať podľa toho. Vo všeobecnosti sa tu musia použiť vzorce, ale v najjednoduchšom prípade dva kroky vedľa predstavujú jeden krok do hĺbky. Ak máte záujem o presné výpočty, bude ľahké ich nájsť na internete, v extrémnych prípadoch sa "umyť" o radu. To isté platí pre akýkoľvek pohyb v izometrii, ktorý sa odohráva aj pri úplne plochom pátraní.
Našťastie všetky tieto otázky už dávno nepatria do kategórie málo prebádaných technológií a na webe je množstvo návodov na programovanie 2D izometrických motorov. Odporúčam vám pozrieť si sekciu článkov stránok ako napr www.gamedev.net
a www.flipcode.com
, alebo jednoducho vložte vhodné kľúčové slová do nejakého vyhľadávacieho nástroja podobného Yahoo.
IsometriX
No, pre tých, ktorí radi „vychytávajú programy“, sme špeciálne usporiadali kompaktný motor podľa názvu IsometriX. Akumuluje v sebe všetko, čo bolo povedané vyššie. Na rozdiel od väčšiny 3D enginov a tvorcov hier, ktoré boli v minulosti recenzované Samopalom, tento engine nemá za cieľ byť jadrom vašej hry. Primárne je určený na to, aby ste v praxi videli, ako sa plnia všemožné teoretické otázky. Motor je úplne napísaný Visual C++, má zdrojový kód a vlastný editor úrovní. Ak vás programovanie nezaujíma, stále sa môžete túlať po testovacej úrovni bez toho, aby ste čokoľvek kompilovali.
Pokiaľ ide o funkcie, IsometriX sa môže zdať viac než skromný: 640 x 480 v 8-bitovej farbe, samozrejme, neplatí. Ale ako som už povedal, je to skôr príklad, z ktorého sa môžete naučiť pracovať s mapami, presúvať postavy, kontrolovať kolízie a mnoho iného. Okrem toho všetko funguje skvele na Windows 9x/2000 a s najväčšou pravdepodobnosťou bude aj na XP.
Ako slovo na rozlúčku
Čokoľvek hovoria, dvojrozmerné kachľové motory sú stále živšie ako všetky živé. V detailoch a kráse kresby sa zatiaľ žiadna 3D hra nemôže porovnávať s klasickými dvojrozmernými hrami. Vezmite si aspoň Fallout Tactics - táto hra využíva snáď najprogresívnejšie úspechy v oblasti 2D. A žiadny jazyk sa neobráti na to, aby označil grafiku tejto hry za mizernú.
Okrem toho sú dlaždice ideálne na vytváranie obrovských svetov. Pomocou segmentácie, kedy je mapa rozdelená na niekoľko častí, z ktorých každý je dynamicky načítaný, môžete vytvárať mapy jednoducho fantastických veľkostí. A aktívne sa používa v RPG hrách. To je ďalší faktor, prečo sa vývojári neponáhľajú do sveta akcelerátorov a multitexturingu.
A nakoniec, grafika dlaždíc sa učí oveľa ľahšie ako akýkoľvek 3D engine (aj keď to môže byť môj subjektívny názor). A naučiť sa DirectDraw pracovať so spritmi je neporovnateľne jednoduchšie a zrozumiteľnejšie ako Direct3D a dokonca OpenGL. Preto sa nesnažte okamžite ponáhľať do prvej línie. Možno by ste mali venovať pozornosť starému dobrému 2D svetu. No, možno trochu 2,5D...
Vo všeobecnosti je tu krásne a opäť nie ruské slovo - mozaika. Pamätajte si, čo to je. To je, keď kúsok po kúsku vytvoríte veľký obrázok, to je asi to isté a sú tam pančuchy. Alebo si spomeňte, ako režú peniaze, keď kladú dlaždice.
// Zlý nápad miešať sem témy blogu...
Akú strechu? Tylde. Nádherná vlastnosť, z podstatného mena sa dá urobiť prídavné meno, ale potom sa to nedá normálne preložiť, ale dá sa to ľahko pochopiť.Vráťme sa k našej téme, dlaždicovej grafike v hrách, čo to je?
Ide o grafiku, ktorá pozostáva z dlaždíc (Čiapka). Príklad:
Niekedy je to veľmi pekné
Tiež dlaždicová grafika v princípe trochu pripomína pixel art, rovnako ako mozaika, aj obrázok je nakreslený pixelmi. Element po elemente.
Viac pixel art tu
Štandardný príklad dlaždíc v štúdiu tvorcu hier
Vezmeme rovnakú obrazovku a zväčšíme ju.
Dlaždice sa neopakujú
Stále čert vie kedy, a už tam prišli na túto vec. A teraz niektorí igrodely pokračujú v strkaní rovnakého typu dlaždíc do radov.
Otázka grafiky v hrách je veľmi dôležitá, pretože silne určuje konečný rozpočet a čas vývoja.
Vyvíjate nástroje ako editor máp a potom ich tam dáte, už to všetko krásne a rozumne usporiadajú. Čím viac nástrojov budú mať, tým to bude krajšie, ale je s tým veľa práce.
Toto všetko nielen nakreslite, ale aj usporiadajte neskôr a potom vymyslite nejaký spôsob náhodnosti prvkov, ak sa to podarí.
Ak chcete, aby hra bola nakoniec krajšia, musíte na jeden strom nakresliť niekoľko škriatok naraz. A nie, vianočný stromček a dub sú rôzne dlaždice a špáradlá, budú oddelené. Potrebujete veľa stromov naraz a veľa dubov naraz.
Dlaždice sa zvyčajne vyrábajú ako balík (súprava), nazývaný - matrica dlaždíc. Ide o veľký fragment, ktorý je rozdelený na menšie. Zhruba niečo takéto:
Všetko je tu celkom jednoduché a zároveň krásne. Téma snehu. S pripravenou sadou dlaždíc ste už urobili polovicu práce, musíte ich len krásne usporiadať.
Dlaždice sú ľahšie ako predmety, sú lepšie pre rýchlosť hry, zvýšia FPS a výkon, ak ich použijete namiesto predmetov. Objekty so škriatkami potrebujete iba vtedy, ak s nimi máte interakciu. Povedzme, že ak plameňomet spáli les, potom áno, s najväčšou pravdepodobnosťou budete musieť urobiť stromy cez objekt.
Ale takmer všetky dekoratívne (čisto vizuálne) prvky môžu byť vyrobené cez dlaždice.
A pre kolíziu môžete jednoducho urobiť z pevnej neviditeľnej oblasti objekt a už ju viesť pod stĺp. Potom cez tyč (sprite - dlaždice) bude nemožné prejsť, pohyb bude blokovaný „pevnou“ plochou.
V, o ktorom teraz robím video, sa objavili nové funkcie pre prácu s dlaždicami, objavili sa animované dlaždice. Môžete ich tiež zavolať (a odstrániť) prostredníctvom kódu. Veľmi zvedavá vec. Teraz tiež môžete umiestniť dlaždice do balíka naraz a rýchlo vyplniť mapovú miestnosť dlaždicami.
Docela pohodlné, najmä pre malé dlaždice.
Ale keď sa rozhodnete urobiť RPG (alebo hra v inom žánri) bez grafiky, budete potrebovať dlaždice. Dúfam, že som odpovedal na otázku - čo sú dlaždice a uviedol prijateľné príklady grafiky dlaždíc v hrách.
A ak vás zaujímajú konkrétne príklady a ako to celé funguje v GameMaker Studio 2, môžete si pozrieť môj video (9 minút). Prihlásiť sa na odber môjho kanál Econ Dude - o vytváraní hier od začiatku ak ste sa ešte neprihlásili na odber.
Čo je to dlaždica
Pravdepodobne viete, čo je dlaždica, ale poďme sa na ňu pozrieť aj tak bližšie. Dlaždica vyzerá ako obrázok s pevnou veľkosťou. Navyše je nakreslený tak, že v porovnaní s inými dlaždicami sa získa jeden obrázok bez viditeľných „švov“. Najjednoduchšie je predstaviť si dlaždice ako dlaždice, ktoré sa používajú na pokrytie stien alebo podláh. Najjednoduchšia dlaždica je štvorcový obrázok, vertikálne a horizontálne symetrický (môžete ho vidieť na obrázku). Ak spojíte tieto obrázky dohromady, získate veľké plátno trávnika. A ak do tohto malebného obrazu pre zmenu zavedieme iný typ dlaždíc, povedzme znázorňujúci cestu, potom už môžeme zostaviť primitívnu mapu.
Poďme si teraz spočítať náklady, ktoré si od nás vyžiada vytvorenie mapy 512x512 buniek. Povedzme, že samotná dlaždica bude mať veľkosť 32 x 32 pixelov, potom bude zaberať 1024 bajtov v pamäti - 1 kilobajt. Po výpočtoch sa ukazuje, že najjednoduchšia mapa zaberá asi 262 kilobajtov v pamäti plus pamäť na ukladanie obrázkov samotných dlaždíc. Ak by sme však plochu rovnakej veľkosti nakreslili ručne, museli by sme na oltár technického pokroku položiť 268 megabajtov (!). A to aj napriek tomu, že som pre jednoduchosť zobral režim 256 farieb. Je jasné, že ani teraz nie každý počítač disponuje takýmto množstvom pamäte, a tak sa dlaždicová štruktúra máp používa v drvivej väčšine dvojrozmerných a v dostatočnom počte trojrozmerných hier.
Vytvárajte mapy
Každá mapa je pole, ktoré špecifikuje umiestnenie dlaždíc na svojich vrstvách, ako aj ich parametre. Najjednoduchšou mapou je matica MxN, kde každý z jej prvkov obsahuje číslo dlaždice z podmienene akceptovanej sekvencie. Ak ste niekedy používali 2D stratégiu alebo editor máp RPG (alebo ste pracovali vo Photoshope), podstatu ľahko pochopíte. Kedy pridávajú sa nové vrstvy, matica sa stáva zložitejšou, získava sa množina (štruktúra) matíc a zavedením akýchkoľvek efektov sa získava vlastný formát mapy, ktorý na disku zaberá viac ako jeden megabajt.
Dlaždice nemusia mať poradové čísla. Naopak, na začiatok by bolo dobré rozložiť si celý číselný rad na niekoľko intervalov. Napríklad rozsah od 0 do 63 zahŕňa bežné dlaždice, po ktorých môžete chodiť (zem, dosky). Od 63 do 127 - nepreniknuteľné húštiny džungle, steny a iné pevné predmety. Ďalším intervalom sú vody jazier a močiarov a nakoniec špeciálne skupiny, ktoré vykonávajú akúkoľvek akciu, keď na ne hrdina „vstúpi“: portály, pasce atď. Teraz, keď Photoshop produkuje grafiku, prideľujete čísla začiatočníkom na základe prijatých pravidiel a v budúcnosti ste oslobodení od mnohých problémov spojených s určovaním priechodnosti stránky alebo ako reagovať, keď hrdina vstúpil na portál.
Pri kreslení mapy môžete mať spočiatku problémy s kreslením izometrických dlaždíc, pretože sú také „zakrivené“, že nie je jasné, kde nakresliť jednu a pokračovať druhú. Ťažkosti môžu nastať pri programovaní plynulého rolovania alebo orezania oblastí mapy. Mimochodom, veľkosti dlaždíc sa najlepšie vykonávajú v akejkoľvek mocnine dvoch (16x16 alebo 32x32), čo vám aj procesoru veľmi pomôže pri výpočtoch.
|
Ako slovo na rozlúčku
|
V tomto príspevku popíšem dva algoritmy na vytváranie zložitých procedurálnych svetov z jednoduchých sád farebných dlaždíc a na základe obmedzení umiestnenia týchto dlaždíc. Ukážem vám, ako pomocou starostlivého dizajnu týchto sád dlaždíc môžete vytvoriť zaujímavý procedurálny obsah, ako sú krajiny s mestami alebo kobky so zložitými vnútornými štruktúrami. Video nižšie ukazuje systém, ktorý vytvára procedurálny svet založený na pravidlách zakódovaných v 43 farebných dlaždiciach.
Správny obklad vyzerá takto:
Ide o obklad, ktorý by mal predstavovať mapu s vodou, pobrežia, trávu, mestá s budovami (modré políčka) a hory so snehovými čiapkami. Čierne čiary zobrazujú hranice medzi dlaždicami.
Myslím si, že je to zaujímavý spôsob, ako opísať a vytvoriť svety, pretože algoritmy na generovanie procedúr veľmi často využívajú prístup zhora nadol. Napríklad v L-systémoch sa používa rekurzívny popis objektu, v ktorom sa pred nízkoúrovňovými určujú veľké detaily vysokej úrovne. Na tomto prístupe nie je nič zlé, ale myslím si, že je zaujímavé vytvárať sady dlaždíc, ktoré dokážu kódovať iba jednoduché vzťahy na nízkej úrovni (napr. morská voda a tráva by mala byť oddelená pobrežím, budovy by mali mať iba konvexné rohy v uhle 90 stupňov) a sledovať, či sa nevyskytnú vzory na vysokej úrovni (napr. štvorcové budovy).
Je intuitívne jasné, že úloha správna tvorba netriviálne ukladanie dlaždíc je ťažké, pretože sady dlaždíc môžu kódovať ľubovoľne široké závislosti. Keď vezmeme do úvahy množinu dlaždíc ako celok, z formálneho hľadiska ide o NP-úplný problém uspokojenia obmedzení. Naivný algoritmus na vytváranie obkladov spočíva v úplnom prehľadávaní priestoru obkladov a beží v exponenciálnom čase. Existuje nádej, že môžeme vytvoriť zaujímavé svety založené na dlaždicových sadách riešených vyhľadávaním, ktoré je možné urýchliť heuristikou. Ďalšou možnosťou je vytvorenie obkladov, ktoré sú približne správne, ale obsahujú malý počet nesprávnych miest. Našiel som dva algoritmy, ktoré dobre fungujú s niektorými zaujímavými sadami dlaždíc a popíšem ich nižšie.
Inicializuje sa celá mapa ako NEVYRIEŠENÁ
Pokiaľ sú na mape NEVYRIEŠENÉ dlaždice
ak je možné umiestniť na mapu nejakú vhodnú dlaždicu
t<- коллекция всех возможных расположений подходящих тайлов
l<- случайная выборка из t, взвешенная по вероятностям тайлов
umiestnite l na mapu
inak
vyberte si náhodnú dlaždicu NEVYRIEŠENÉ a priraďte stav NEVYRIEŠENÝ všetkým jeho susedom
Neexistujú žiadne záruky, že algoritmus dokončí svoju prácu. Jednoduchá sada dlaždíc s dvoma dlaždicami, ktoré nemajú spoločné farby, spôsobí, že algoritmus bude navždy zacyklený. Ešte jednoduchším prípadom by bola jedna dlaždica s rôznymi farbami na vrchu a spodku. Bolo by múdre nájsť nejaký spôsob, ako zistiť, či sady dlaždíc nedokážu vytvoriť správne dlaždice. Môžeme povedať, že sada dlaždíc je určite pravdivá, ak dokáže obložiť nekonečnú rovinu. V niektorých prípadoch sa dá ľahko dokázať, že sada dlaždíc môže alebo nemusí obkladať nekonečnú rovinu, ale vo všeobecnosti je tento problém neriešiteľný. Úlohou dizajnéra je preto vytvoriť dlaždicovú sadu, ktorá dokáže vytvoriť správny obklad.
Tento algoritmus nedokáže nájsť dobré riešenia pre sadu dlaždíc podzemia z videa na začiatku príspevku. Funguje dobre s jednoduchšími dlaždicami. Chceli by sme vyriešiť zložitejšie sady dlaždíc s mnohými možnými typmi prechodov medzi dlaždicami a rôznymi kódovanými pravidlami (napríklad, že cesty by sa mali začínať a končiť v blízkosti budov).
Potrebujeme algoritmus, ktorý je schopný pozerať sa dopredu a vytvárať rozloženia dlaždíc, pričom si uvedomuje možnosti, v ktorých sú tieto rozloženia otvorené pre budúce umiestnenie dlaždíc. Umožní nám to efektívne riešiť zložité sady dlaždíc.
Toto vyhľadávanie nepoužíva žiadne metódy lokálnej integrity. To znamená, že sa nepokúšame o umiestnenie dlaždíc, ktoré neskôr povedie k neriešiteľnej situácii, čo i len jeden krok hľadania na ceste. Hľadanie je možné urýchliť sledovaním vplyvu, ktorý bude mať lokalita na možné miesta niekoľko dlaždíc od aktuálneho bodu. Dúfame však, že to umožní, aby pátranie nestrávilo toľko času rušením svojej práce. To je presne to, čo robí náš algoritmus.
Náročnosť vytvorenia správneho obkladu do značnej miery závisí od počtu prechodov potrebných na prechod medzi dvoma typmi obkladov. Jednoduchá sada dlaždíc môže obsahovať iba piesok, vodu a trávu. Ak sa tráva a voda nemôžu navzájom dotýkať, potom medzi nimi musí byť prechod do piesku. Toto je jednoduchý príklad, ktorý môže algoritmus uvedený vyššie ľahko vyriešiť. V zložitejšom prípade môžu byť prítomné viaceré vstavané úrovne typov dlaždíc. Môžeme mať napríklad hlbokú vodu, vodu, piesok, trávu, vysokú nížinu, horu a zasnežený vrchol. Aby sa všetky tieto typy dlaždíc objavili na mape, musí existovať sedem prechodov, za predpokladu, že tieto typy sa nemôžu navzájom dotýkať okrem poradia, ktoré som uviedol. Ďalšia zložitosť môže byť pridaná vytvorením dlaždíc, ktoré prirodzene vytvárajú rozsiahle závislosti medzi dlaždicami, ako sú cesty, ktoré musia začínať a končiť v blízkosti určitých typov dlaždíc.
Intuitívne by mal byť algoritmus pre túto úlohu schopný „pozerať sa dopredu“ a zvážiť aspoň niekoľko prechodov, ktoré môžu byť dôsledkom zvoleného miesta. Aby sme to mohli implementovať, môžeme si predstaviť mapu dlaždíc ako rozdelenie pravdepodobnosti pre dlaždice v každom bode. Keď algoritmus nájde dlaždicu, aktualizuje rozdelenie pravdepodobnosti okolo tejto dlaždice v reakcii na jej umiestnenie takým spôsobom, že sa zvýšia pravdepodobnosti susedných dlaždíc, ktoré budú pravdepodobne kompatibilné s aktuálnou polohou.
Napríklad, ak je na mape dlaždica s vodou, potom dlaždice vedľa nej musia obsahovať vodu. Dlaždice vedľa nich môžu tiež obsahovať vodu, ale existujú aj iné možnosti, ako napríklad tráva, ak je pobrežie umiestnené vedľa pôvodnej vodnej dlaždice. Čím ďalej sa vzďaľujeme od umiestnenej dlaždice, tým viac typov dlaždíc je možných. Aby sme využili toto pozorovanie, môžeme spočítať počet spôsobov, ktorými sa môžeme dostať na umiestnenie každej dlaždice vedľa pôvodnej dlaždice. V niektorých prípadoch môže iba jedna sekvencia prechodov viesť k prechodu z jednej dlaždice na druhú v danej vzdialenosti. V iných prípadoch môže existovať veľa rôznych prechodových sekvencií. Po umiestnení dlaždíc môžeme určiť rozloženie pravdepodobnosti dlaždíc v susedných bodoch tak, že spočítame počet spôsobov, ktorými môžeme urobiť prechod z dlaždíc, ktoré sme umiestnili, na susedné dlaždičky. „Pohľad dopredu“, ktorý tento algoritmus vykonáva, je sledovať tieto počty prechodov a zaobchádzať s nimi ako s rozdeleniami pravdepodobnosti, z ktorých možno vybrať nové dlaždice na umiestnenie.
Toto je najefektívnejší algoritmus, ktorý som bol schopný implementovať pre túto úlohu. Má to ďalšiu výhodu: pri vykonávaní vytvára nádherné vykreslenia. Možno existuje spôsob, ako zlepšiť tento algoritmus zavedením nejakej formy spätného sledovania. Ak sa na výslednom dokončenom obklade nachádza neplatný bod, potom zrušenie umiestnení susedných obkladačiek a prevzorkovanie z výsledného rozloženia v ich bodoch môže umožniť nájdenie opravy tohto dokončeného obkladu. Samozrejme, ak chcete pokračovať v hľadaní, kým nenájdete správnu dlažbu, potom prekročíte stanovený garantovaný čas chodu.
Predstavte si, že dlaždica je umiestnená na úplne prázdnej mape. Toto umiestnenie aktualizuje pravdepodobnosti susedných dlaždíc. Môžeme si myslieť, že tieto aktualizované distribúcie majú predchádzajúcu distribúciu danú predchádzajúcimi rozloženiami dlaždíc. Ak je umiestnených viacero dlaždíc, toto predchádzajúce pridelenie sa bude zdieľať. Aproximujem túto zadnú pravdepodobnosť vzhľadom na predchádzajúci spoj ako súčin rozdelení pre každé miesto v minulosti.
Znížením počtu možných priradení susedných dlaždíc výrazne zmenšujeme vyhľadávací priestor, ktorý musí algoritmus spracovať po každom umiestnení. Vieme, že v tejto malej štvrti sa všetky pravdepodobnosti výskytu dlaždíc nezlučiteľných s miestom rovnajú nule. Je to analogické s odstránením týchto hodnôt z rozsahu premenných v týchto bodoch. To znamená, že každý pár susedných bodov v oblasti okolo umiestnenej dlaždice má vo svojej oblasti určenia určitú dlaždicu, ktorá je kompatibilná s nejakou dlaždicou, ktorá je stále v oblasti susedov. Keď sú dve premenné obmedzené na problém RO a ich domény obsahujú iba hodnoty, ktoré spĺňajú obmedzenie, hovorí sa, že majú oblúkovú kompatibilitu, čo znamená, že táto technika je v skutočnosti efektívnou stratégiou na zavedenie oblúkovej kompatibility.
V ZDV je „najobmedzenejšia“ premenná v danom čiastočnom priradení premenná s najmenším možným počtom hodnôt v rozsahu. Princíp umiestnenia dlaždice v bode s minimálnym rozdelením entropie na mape je podobný priradeniu hodnoty najviac obmedzujúcej premennej v CPD, čo je štandardná heuristika usporiadania premenných pri riešení CPD pomocou vyhľadávania.
Príklad tohto princípu je uvedený nižšie. Zmenou pravdepodobnosti, že sa objaví pevná vodná doska, môžem upraviť veľkosť a frekvenciu vodných plôch objavujúcich sa na mape.
Riešiteľ „Najobmedzenejšie umiestnenie s konzistenciou fuzzy oblúka“ je podobný projektu Wave Function Collapse používateľa služby Twitter.