Čo sú dlaždice? Dlaždicová grafika v hrách. Procedurálne svety z jednoduchých dlaždíc

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

  • Čo je hra založená na dlaždiciach?
  • Vytvorte alebo nájdite svoje vlastné „dlaždice“
  • Zápis kódu na zobrazenie úrovne
  • Úpravy úrovní

Čo je hra založená na dlaždiciach?

Samozrejme, definíciu dlaždicovej grafiky nájdete na Wikipédii, ale aby ste pochopili, čo to je, stačí sa naučiť niekoľko vecí.
  • Dlaždica - dlaždica je malý obrázok, zvyčajne obdĺžnikového tvaru, ktorý pri vytváraní veľkých obrázkov funguje ako skladačka.
  • Mapa - skupina dlaždíc spojených dohromady
  • Tile-based nás odkazuje na spôsob vytvárania úrovní v hrách. Kód umiestňuje dlaždice na vopred určené miesta
V našom článku budú mať dlaždice obdĺžnikový tvar. Existuje niekoľko skvelých funkcií, ktoré získate s dlaždicovou grafikou. Najlepšie na tom je, že nie je potrebné kresliť obrovské obrázky pre každú úroveň. Päťdesiat obrázkov s rozlíšením 1280 x 768 pixelov pre hru 50 úrovní oproti jednému obrázku so stovkou dlaždíc je obrovský rozdiel. Ďalšou výhodou je, že je oveľa jednoduchšie umiestňovať položky pomocou dlaždicovej grafiky.

Vytvorte alebo vyhľadajte dlaždice

Prvá vec, ktorú potrebujete na zostavenie motora, je sada dlaždíc. Máte dve možnosti: použiť hotové dlaždice alebo si vyrobiť vlastné. Ak sa rozhodnete použiť hotové obrázky, potom ich možno ľahko nájsť na celom internete. Nevýhodou je, že tieto grafiky neboli vyrobené špeciálne pre vašu hru. Na druhej strane, ak práve experimentujete, potom je táto možnosť celkom vhodná.

Myslím si, že s hľadaním dlaždíc by nemali byť žiadne problémy, takže sa tomu nebudem podrobne venovať.

Vytváranie dlaždíc
Existuje mnoho skvelých nástrojov, ktoré uľahčujú vytváranie vlastných obrázkov. Mnoho vývojárov používa tieto nástroje pre svoju prácu.

Toto sú najobľúbenejšie nástroje na vytváranie pixelových obrázkov. Ak potrebujete niečo výkonnejšie, potom je GIMP dokonalý.

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.

Písanie kódu

Keď máme všetko potrebné, môžeme sa vrhnúť priamo do samotného programovania.
Zobrazte jednu dlaždicu na obrazovku
Začnime najjednoduchšou úlohou, zobrazením jednej dlaždice na obrazovke. Uistite sa, že všetky vaše obrázky majú rovnakú veľkosť a sú uložené v rôznych súboroch (o ukladaní spritov do rovnakého súboru si povieme neskôr).

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.

Použitie polí na zobrazenie všetkých dlaždíc
Ďalším krokom je prísť s metódou na zobrazenie všetkých dlaždíc. Najjednoduchším spôsobom je vyplniť pole číslami, z ktorých každé zodpovedá nejakej dlaždici. Potom jednoducho iterujete cez všetky prvky poľa a zobrazíte ich.

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

Vzorec
Poďme diskutovať o vzorci, ktorý som uviedol 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é.

Rôzne druhy dlaždíc
Dobre, teraz máme mapu plnú rovnakých prvkov. Bolo by pekné mať viac ako jeden typ prvku, čo znamená, že budeme musieť zmeniť náš konštruktor v triede Tile
public function new(id:Int) ( super(); switch(id) ( case 1: image = new Bitmap(Assets.getBitmapData("assets/grassLeftBlock.png")); case 2: image = new Bitmap(Assets. getBitmapData("assets/grassCenterBlock.png")); prípad 3: image = new Bitmap(Assets.getBitmapData("assets/grassRightBlock.png")); prípad 4: image = new Bitmap(Assets.getBitmapData("assets/goldBlock) .png")); prípad 5: image = new Bitmap(Assets.getBitmapData("assets/globe.png")); prípad 6: image = new Bitmap(Assets.getBitmapData("assets/mushroom.png")); ) addChild(image); )
Teraz ich máme šesť odlišné typy dlaždice. Potrebujem konštrukciu prepínača na výber obrázka, ktorý sa má zobraziť. Možno ste si všimli, že konštruktor teraz berie ako parameter číslo, ktoré označuje typ dlaždice.

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.

Záver

Práve ste vytvorili motor založený na príbehoch. Teraz viete, čo je grafika dlaždíc a ako ju používať. Naučili ste sa vytvárať a upravovať úrovne. Ale nezastavujte sa pri tom, v našom motore je toho oveľa viac, čo treba zlepšiť. Č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. Jednoduchá obdĺžniková dlažba.
Obdĺžnikové a štvorcové dlaždice sú dobré na znázornenie pohľadu z vtáčej perspektívy, ale existuje aj iný druh projekcie nazývaný izometria. Používa sa, keď je potrebné dať zmysel pre objem, hĺbku, urobiť pseudo-3D. Preto sa izometrické systémy niekedy označujú ako 2,5D. Aký to má zmysel? Teraz bude dlaždica vyzerať, že je otočená v jednom uhle smerom k divákovi a akoby išla hlboko (pozrite sa na ilustráciu). Dvojrozmerný obraz vo svojej podstate nadobúda tretí rozmer. V tomto prípade sa rozmery štvorca (dlaždice) určujú takto:
1. Dĺžka je od ľavého krajného po pravý pravý bod obrázka.
2. Šírka - od „najvzdialenejšieho“ po „najbližší“ bod k divákovi.
3. Výška - "hrúbka" dlaždice.
Na vytvorenie efektu objemu by mala byť šírka menšia ako dĺžka asi o polovicu. Experimentovaním s týmto vzťahom otočíte „dlaždicu“ v trojrozmernom priestore a vyberiete požadovanú projekciu. Na tieto účely je užitočné použiť nejaký analóg 3D štúdia. Vytvorte tam dlaždicu, vyberte jej polohu a potom zmerajte strany a výsledné pomery.
Ale ako kreslíte teraz? Jednoduchá izometrická dlaždica. taká dlaždica na obrazovke? Bežné funkcie kreslenia sú totiž zvyknuté na to, že dostanú obdĺžnikovú plochu na kreslenie, čo robia dobre. Tento problém je vyriešený pomocou masiek. Na obrázku uvidíte, že obrysy dlaždice spadajú do bielej plochy a to, čo po nej zostane, je natreté čiernou farbou a tvorí obdĺžnik. Ukazuje sa princíp šablóny: obraz sa prekrýva na masku a na „plátno“ a iba tie body, ktoré spadajú do biela farba. Dokonca aj štandardné funkcie kreslenia systému Windows sú vyškolené na takéto veci, nehovoriac o funkciách DirectX. Súčasne použitie masiek umožňuje robiť ďalšie efekty. Môžete napríklad nakresliť iba záhlavie dlaždice a zahodiť jej výšku. Alebo vytvorte rôzne časti trávy pomocou jedného obrázka. Ak vytvoríme masku pozostávajúcu výlučne z otvorov a použijeme ju na zobrazenie dlaždice s trávou namiesto už existujúcej dlaždice iného typu, získame hladký prechod z jedného povrchu na druhý. Podobná technika môže byť použitá v mnohých prípadoch a „deravé“ masky môžu byť generované náhodne. Nikto potom neuhádne, že nemáte predrenderovanú krajinu. Ukazuje sa akýsi druh multitextúrovania: keď sa dva vzájomne priehľadné obrázky prekrývajú na jednej ploche. Je pravda, že to vyžaduje dostatočné množstvo počítačového času.
V najjednoduchšom prípade je výška dlaždice nulová a nie je vypočítaná. Ak však použijeme len takéto „tehly“, tak tvorbu docielime v najlepší prípad príjemná lúka. Použitím rôznych výšok dosiahneme realistickejšiu krajinu so stenami a kopcami. Samozrejme, bude ťažšie zobraziť takéto „tehly“ na obrazovke. Teraz sa musíme zoznámiť s konceptom základnej línie dlaždice.
Základná línia- toto je miesto, kde je dlaždica v kontakte so "zemou". Na obrázku sú zvýraznené. Ružová. Základná čiara môže ísť kdekoľvek na zvislej čiare, pretože rovnaký obrázok možno použiť na stenu rôznych veľkostí. Potom sa na mape umiestnenia dlaždíc zobrazia základné čiary a samotné dlaždice sa začnú kresliť z vyššej pozície.

2Dfx

Už sme sa pozreli na to, aké efekty je možné vytvoriť pomocou viacerých vrstiev dlaždíc. AT skutočné hry Takto sa vypočítajú rozmery dlaždice. celá mapa je vrstvená ako povestný koláč: prvá vrstva- to je zem, kamene, blato, voda a podobne; druhá vrstva- akýkoľvek okraj, ako sú stromy, skaly, stoly a stoličky; tretia vrstva- predmety: ľudia, príšery, kľúče a magické elixíry.
Pre vyššie uvedené efekty môžete pridať viac vrstiev, ale zvyčajne sa na dosiahnutie najlepšieho výkonu používajú štyri alebo päť. Povedzme, že štvrtá vrstva v našej schéme môže byť pridaná na vytvorenie objektov, ktoré budú nad úrovňou hlavy postáv, ako sú strechy domov. Všetci ste už videli tento efekt: keď sa hrdina priblíži k budove, strecha zrazu zmizne a vy môžete vidieť vnútro budovy. Je teda veľmi jednoduché prinútiť dlaždicový engine, aby zastavil vykresľovanie štvrtej vrstvy, aby používateľ videl všetko, čo sa pod ňou skrýva.
Dlaždicové motory, ktoré zakladajú svoju grafiku na princípe paliet, aktívne využívajú efekt rotácie farieb. Nech sa na čerpanie vody použije nejaká modrá gama. Potom zmenou tohto gama alebo naopak preskupením indexov v dlaždici môžete získať efekt tečúcej vody. Rovnaký trik funguje aj na iných povrchoch. Povedzme, v jaskyni dlaždice zobrazujúce skalu, Dlaždice a jeho maska. Pri kreslení na obrazovku
je viditeľná iba časť, ktorá padá do bielej
oblasť masky. môže byť tmavšie. A ak postavíte do ruky baterku a v závislosti od jej polohy zosvetlíte okolie, efekt bude veľmi krásny. Nehovorím o dynamickej zmene dňa a noci. Správa palety - veľmi záujem Spýtaj sa, navyše veľmi dobre vyvinuté a študované v období celkového 256-kvitnutia, kedy sa bez paliet nikto nezaobišiel. Dokonca aj teraz, keď sa farba menšia ako 16 bitov považuje za neslušnú, sú sprity uložené vo svojich vlastných formátoch založených na rovnakých paletách.
Mimochodom, kto povedal, že na zobrazovanie dlaždíc je potrebné použiť hackneyované procedúry DirectDraw? Samozrejme, pre na dlhú dobu Algoritmy boli vyvinuté pre mnoho efektov: dynamické osvetlenie a dokonca aj časticové systémy. Ale všetky fungujú veľmi pomaly. Ale nie sme v roku 1996 a Voodoo Graphics je vzácnosťou už len preto, že ju už každý zahodil. Preto by bolo veľmi lákavé využiť schopnosti 3D akcelerátora pre každodenné potreby.
3D knižnice môžu pomôcť s výstupom textúrovaných polygónov (rovnaké dlaždice) - najbrzdnejší moment v 2D postupoch. Ako už bolo povedané, filtrovanie (alias umelecké rozmazávanie textúr) je samozrejmosťou. Okrem toho sa sprístupnia všetky efekty, ktoré sú dostupné len v trojrozmerných hrách: svetlo, priehľadnosť, tiene, svetelné prechody atď. Tento predmet je dostatočne zaujímavý na precvičenie. Možno je to budúcnosť dlaždicových hier.

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

(dlaždica - dlaždica)- ide v podstate o spôsob vytvárania veľkých obrazov (snímky) s menšími predmetmi.

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é


Tieto stoličky a stôl sú tiež dlaždice. Dlaždice sú steny, podlahy a iné prvky. Dvere tu s najväčšou pravdepodobnosťou nie sú len dlaždice, ale už predmety, pretože interakcia s nimi je možná.

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


Ale na tomto obrázku (toto vôbec nie je hra)), grafika nie je kachľová. Všetko sa tu kreslí individuálne. Tu sa dostávame k prvému problému s grafikou dlaždíc – niekedy vyzerá príliš monotónne.


Štandardný príklad dlaždíc v štúdiu tvorcu hier


Pamätajte si dokonca aj na editor máp StarCraft:


A potom si prečítajte môj článok - kde som o ňom písal. Tu v prvom starcovi sa to všetko robilo dosť kuriózne a tam bolo možné čiastočne prekonať monotónnosť, pretože takmer každý prvok bol generovaný náhodne, aj keď bol rovnakého typu. O čom to hovorím?

Vezmeme rovnakú obrazovku a zväčšíme ju.


Dlaždice sa neopakujú


A kedy bol tento môj obľúbený prvý Starcraft?

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:



A teraz sú z tejto sady vyňaté konkrétne dlaždice. Môže to byť len zelený štvorec - tráva, strom alebo čokoľvek iné.

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.

  • Prečítajte si tiež:
Povedzme, že ide o tie isté piliere. Prečo potrebujete interakciu hrdinu so stĺpmi? Potrebujete iba zrážku (keď nemôžeš prejsť).

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.


Pre začiatočníka, ktorý chce vytvárať hry v game maker, v zásade nie je potrebné používať dlaždice, často to všetko urobia začiatočníci (pole, stromy a pod.) bežné predmety so škriatkami a pre jednoduché hry môže to byť ok.

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.
Obdĺžnikové a štvorcové dlaždice sú dobré na znázornenie pohľadu z vtáčej perspektívy, ale existuje aj iný druh projekcie nazývaný izometria. Používa sa, keď je potrebné dať zmysel pre objem, hĺbku, urobiť pseudo-3D. Preto sa izometrické systémy niekedy označujú ako 2,5D. Aký to má zmysel? Teraz bude dlaždica vyzerať, že je otočená v jednom uhle smerom k divákovi a akoby išla hlboko (pozrite sa na ilustráciu). Dvojrozmerný obraz vo svojej podstate nadobúda tretí rozmer. V tomto prípade sa rozmery štvorca (dlaždice) určujú takto:
1. Dĺžka je od ľavého krajného po pravý pravý bod obrázka.
2. Šírka - od „najvzdialenejšieho“ po „najbližší“ bod k divákovi.
3. Výška - "hrúbka" dlaždice.
Na vytvorenie efektu objemu by mala byť šírka menšia ako dĺžka asi o polovicu. Experimentovaním s týmto vzťahom otočíte „dlaždicu“ v trojrozmernom priestore a vyberiete požadovanú projekciu. Na tieto účely je užitočné použiť nejaký analóg 3D štúdia. Vytvorte tam dlaždicu, vyberte jej polohu a potom zmerajte strany a výsledné pomery.
Ale ako kreslíte teraz?
taká dlaždica na obrazovke? Bežné funkcie kreslenia sú totiž zvyknuté na to, že dostanú obdĺžnikovú plochu na kreslenie, čo robia dobre. Tento problém je vyriešený pomocou masiek. Na obrázku uvidíte, že obrysy dlaždice spadajú do bielej plochy a to, čo po nej zostane, je natreté čiernou farbou a tvorí obdĺžnik. Ukazuje sa princíp šablóny: obraz je prekrytý na maske a na „plátne“ a prechádzajú iba tie body, ktoré spadajú do bielej. Dokonca štandardné Funkcie kreslenia systému Windows sú vyškolené na to, aby robili takéto veci, nehovoriac o funkciách DirectX. Súčasne použitie masiek umožňuje robiť ďalšie efekty. Môžete napríklad nakresliť iba záhlavie dlaždice a zahodiť jej výšku. Alebo vytvorte rôzne časti trávy pomocou jedného obrázka. Ak vytvoríme masku pozostávajúcu výlučne z otvorov a použijeme ju na zobrazenie dlaždice s trávou namiesto už existujúcej dlaždice iného typu, získame hladký prechod z jedného povrchu na druhý. Podobná technika môže byť použitá v mnohých prípadoch a „deravé“ masky môžu byť generované náhodne. Nikto potom neuhádne, že nemáte predrenderovanú krajinu. Ukazuje sa akýsi druh multitextúrovania: keď sa dva vzájomne priehľadné obrázky prekrývajú na jednej ploche. Je pravda, že to vyžaduje dostatočné množstvo počítačového času.
V najjednoduchšom prípade je výška dlaždice nulová a nie je vypočítaná. Ak však použijeme len takéto „tehly“, tak docielime nanajvýš vytvorenie príjemnej paseky. Použitím rôznych výšok dosiahneme realistickejšiu krajinu so stenami a kopcami. Samozrejme, bude ťažšie zobraziť takéto „tehly“ na obrazovke. Teraz sa musíme zoznámiť s konceptom základnej línie dlaždice.
Základná línia- toto je miesto, kde je dlaždica v kontakte so "zemou". Na obrázku sú zvýraznené ružovou farbou. Základná čiara môže ísť kdekoľvek na zvislej čiare, pretože rovnaký obrázok možno použiť na stenu rôznych veľkostí. Potom sa na mape umiestnenia dlaždíc zobrazia základné čiary a samotné dlaždice sa začnú kresliť z vyššej pozície.

2Dfx

Už sme sa pozreli na to, aké efekty je možné vytvoriť pomocou viacerých vrstiev dlaždíc. V skutočných hrách
celá mapa je vrstvená ako povestný koláč: prvá vrstva- to je zem, kamene, blato, voda a podobne; druhá vrstva- akýkoľvek okraj, ako sú stromy, skaly, stoly a stoličky; tretia vrstva- predmety: ľudia, príšery, kľúče a magické elixíry.
Pre vyššie uvedené efekty môžete pridať viac vrstiev, ale zvyčajne sa na dosiahnutie najlepšieho výkonu používajú štyri alebo päť. Povedzme, že štvrtá vrstva v našej schéme môže byť pridaná na vytvorenie objektov, ktoré budú nad úrovňou hlavy postáv, ako sú strechy domov. Všetci ste už videli tento efekt: keď sa hrdina priblíži k budove, strecha zrazu zmizne a vy môžete vidieť vnútro budovy. Je teda veľmi jednoduché prinútiť dlaždicový engine, aby zastavil vykresľovanie štvrtej vrstvy, aby používateľ videl všetko, čo sa pod ňou skrýva.
Dlaždicové motory, ktoré zakladajú svoju grafiku na princípe paliet, aktívne využívajú efekt rotácie farieb. Nech sa na čerpanie vody použije nejaká modrá gama. Potom zmenou tohto gama alebo naopak preskupením indexov v dlaždici môžete získať efekt tečúcej vody. Rovnaký trik funguje aj na iných povrchoch. Povedzme, v jaskyni dlaždice zobrazujúce skalu,
môže byť tmavšie. A ak postavíte do ruky baterku a v závislosti od jej polohy zosvetlíte okolie, efekt bude veľmi krásny. Nehovorím o dynamickej zmene dňa a noci. Správa paliet je veľmi zaujímavý predmet, navyše veľmi dobre navrhnutý a študoval v období celkového 256-kvitnutia, keď sa bez paliet nikto nezaobišiel. Dokonca aj teraz, keď sa farba menšia ako 16 bitov považuje za neslušnú, sú sprity uložené vo svojich vlastných formátoch založených na rovnakých paletách.
Mimochodom, kto povedal, že na zobrazovanie dlaždíc je potrebné použiť hackneyované procedúry DirectDraw? Samozrejme, počas dlhej doby existencie boli vyvinuté algoritmy pre mnoho efektov: dynamické osvetlenie a dokonca aj časticové systémy. Ale všetky fungujú veľmi pomaly. Ale nie sme v roku 1996 a Voodoo Graphics je vzácnosťou už len preto, že ju už každý zahodil. Preto by bolo veľmi lákavé využiť schopnosti 3D akcelerátora pre každodenné potreby.
3D knižnice môžu pomôcť s výstupom textúrovaných polygónov (rovnaké dlaždice) - najbrzdnejší moment v 2D postupoch. Ako už bolo povedané, filtrovanie (alias umelecké rozmazávanie textúr) je samozrejmosťou. Okrem toho sa sprístupnia všetky efekty, ktoré sú dostupné len v trojrozmerných hrách: svetlo, priehľadnosť, tiene, svetelné prechody atď. Tento predmet je dostatočne zaujímavý na precvičenie. Možno je to budúcnosť dlaždicový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.

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 väčšina kariet mať rozmery ako 128x128 alebo 512x512.
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 ty
nezaujímate sa o programovanie, 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...
  • Preklad

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.


Na obrázku nižšie je zobrazená sada dlaždíc (tileset), na základe ktorej je z videa generovaný svet. Svet je anotovaný, aby vám pomohol prezentovať ho v reálnom prostredí.


Obkladanie môžeme definovať ako konečnú mriežku, v ktorej je každá z dlaždíc vo svojej vlastnej bunke mriežky. Pravý svet budeme definovať ako svet, v ktorom musia byť farby pozdĺž okrajov susedných dlaždíc rovnaké.
Obklad má len jedno železné pravidlo: farby okrajov dlaždíc sa musia zhodovať. Celá štruktúra na vysokej úrovni sa vyvíja na základe tohto pravidla.

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

Dlažba je NP-úplný problém uspokojovania obmedzení

Pre čitateľa, ktorý je oboznámený s problémami uspokojovania obmedzení (CSP), je už zrejmé, že dlaždice konečného sveta sú CSP. V ZUO máme veľa premenných, množinu hodnôt, ktoré môže každá premenná nadobudnúť (nazýva sa jej rozsah) a veľa obmedzení. V našom prípade sú premenné súradnice na mape, doménou každej premennej je sada dlaždíc a obmedzenia spočívajú v tom, že okraje dlaždíc sa musia zhodovať s okrajmi susedných dlaždíc.

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.

Metóda 1: Greedy layout so zadnými prechodmi

Vyberáme náhodné miesta a umiestňujeme tam vhodné dlaždice. Ak sa zasekneme, niektoré z nich odstráňte a skúste to znova.

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


Prvým pokusom o vytvorenie obkladu zo sady dlaždíc bolo mať celú mriežku v nevyriešenom stave, potom som opakovane umiestnil náhodnú dlaždicu na vhodné miesto, alebo ak neboli žiadne vhodné miesta, pridelil som malú plochu. na nedoriešenú škridlu do stavu "nevyriešenie" a pokračovalo sa v zištnom usporiadaní dlaždíc. „Greedy layout“ je stratégia usporiadania dlaždice, pokiaľ sa jej okraje zhodujú s už položenými dlaždicami, bez ohľadu na to, či by takéto usporiadanie vytvorilo čiastočný obklad, ktorý nemožno dokončiť bez výmeny už položených dlaždíc. Keď táto situácia nastane a už nemôžeme usporiadať dlaždice, potom musíme odstrániť niektoré z predtým umiestnených dlaždíc. Nevieme však, ktoré z nich je najlepšie odstrániť, pretože ak by sa nám podarilo vyriešiť problém, pravdepodobne by sme v prvom rade mohli vyriešiť aj problém s dlaždicami. Aby sme dali algoritmu ešte jednu šancu nájsť vhodnú dlaždicu pre danú oblasť, priradíme všetky dlaždice okolo nevyriešeného bodu do stavu „nevyriešené“ a pokračujeme v stratégii chamtivého umiestnenia. Dúfame, že skôr či neskôr sa nájde ten správny obklad, ale nie je to zaručené. Algoritmus bude bežať, kým sa nenájde správna dlaždica, čo môže trvať nekonečne dlho. Nemá schopnosť určiť, či je sada dlaždíc neriešiteľná.

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.

Z hľadiska uspokojovania obmedzení

Tento algoritmus je podobný spätnému vyhľadávaniu. V každom kroku sa snažíme priradiť jednu premennú. Ak nemôžeme, potom zrušíme priradenie premennej a všetkých premenných, ktoré sú k nej pripojené pomocou obmedzení. Toto sa nazýva „backjumping“ a líši sa od backtrackingu, v ktorom rušíme priradenie jednej premennej po druhej, kým nebudeme môcť pokračovať v platnom priraďovaní. Pri backtrackingu spravidla rušíme priradenie premenných v opačnom poradí, v akom boli priradené, avšak pri skoku späť premenné rušíme podľa štruktúry uvažovaného problému. Je logické, že ak nemôžeme umiestniť žiadnu dlaždicu na konkrétny bod, musíme zmeniť umiestnenie susedných dlaždíc, pretože ich umiestnenie vytvorilo neriešiteľnú situáciu. Návrat späť nás môže viesť k zrušeniu priradenia premenných, ktoré sú priestorovo vzdialené, ale boli nedávno priradené.

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.

Metóda 2: Najobmedzujúcejšie umiestnenie a distribúcia miestnych informácií

Zachovávame rozdelenie pravdepodobnosti pre dlaždice v každom bode, pričom pri rozhodovaní o umiestnení robíme nemiestne zmeny v týchto rozdeleniach. Nikdy nerobíme návrat späť.
Ďalej popíšem algoritmus, ktorý sa zaručene dokončí a prinesie vizuálne príjemnejšie výsledky pre všetky testované dlaždice. Okrem toho dokáže vytvoriť takmer správne obklady pre oveľa zložitejšie dlaždice. Kompromisom je, že tento algoritmus nezaručuje, že výstupom bude vždy správna dlaždica. Časť Optimalizácie popisuje optimalizácie, ktoré umožňujú rýchlejšiemu spusteniu tohto algoritmu aj na väčších súpravách dlaždíc a máp.

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.


V každom kroku algoritmus preskúma všetky nevyriešené miesta dlaždíc, každé s rozdelením pravdepodobnosti dlaždíc, a vyberie jedno miesto, ktoré sa „priblíži“ ku dlaždici. Vyberie distribúciu z mapy s minimálnou entropiou. Multinomické distribúcie s nízkou entropiou majú tendenciu mať pravdepodobnosti sústredené v niekoľkých režimoch, takže konvergencia týchto foriem má za následok usporiadanie dlaždíc, ktoré už majú nejaké obmedzenia. To je dôvod, prečo algoritmus umiestni dlaždice vedľa dlaždíc, ktoré sme vyriešili ako prvé.

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.

Optimalizácie

Najdôležitejšou operáciou tejto metódy je aktualizácia pravdepodobnosti okolo nájdenej dlaždice. Jedným z prístupov by bolo spočítať možné prechody „von“ z umiestnenej dlaždice vždy, keď sa dlaždica nachádza. Pôjde to veľmi pomaly, pretože pre každý bod mapy, do ktorého sa rozšíria nové pravdepodobnosti, bude potrebné zvážiť veľa prechodových párov. Samozrejmou optimalizáciou by bolo, aby rozptyl nepokrýval celú mapu. Zaujímavejšou optimalizáciou je uložiť do vyrovnávacej pamäte vplyv, ktorý bude mať každé umiestnenie dlaždíc na body okolo seba, takže každé umiestnenie dlaždíc jednoducho vyhľadá, aké typy zmien daná poloha vykoná v susedných pravdepodobnostiach, a potom túto zmenu aplikuje pomocou niekoľkých jednoduchých krokov. operácií. Nižšie popíšem moju implementáciu tejto optimalizačnej metódy.

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.


Aby som to mohol implementovať, predstavím si, že keď je dlaždica umiestnená na prázdnu mapu, urobí to významné zmeny v rozložení susedných bodov na mape. Nazvem tieto aktualizácie guľa dlaždicu, to znamená sféru vplyvu dlaždice, ktorá sa okolo nej premieta, keď je umiestnená na prázdnu kartu. Keď sú dve dlaždice umiestnené vedľa seba, ich gule interagujú a vytvárajú konečné rozmiestnenia, ktoré sú ovplyvnené oboma usporiadaniami. Vzhľadom na to, že veľa dlaždíc sa môže nachádzať v blízkosti daného nevyriešeného miesta, bude existovať veľký počet interakčných obmedzení, takže rozhodnutie na základe počtu na určenie pravdepodobnosti výskytu rôznych dlaždíc je veľmi pomalý proces. Čo ak namiesto toho vezmeme do úvahy iba jednoduchý model interakcie medzi vopred vypočítanými sférami dlaždíc, ktoré už boli umiestnené na mape?
Pri lokalizácii dlaždice aktualizujem mapu pravdepodobnosti pre každý prvok vynásobením rozloženia gule tejto dlaždice na bod mapy rozdelením už uloženým v tomto bode mapy. Môže byť užitočné pozrieť sa na príklad toho, čo to môže urobiť s distribučnou mapou. Predpokladajme, že daný bod na mape má momentálne rozloženie, pri ktorom je rovnako pravdepodobné, že si vyberie trávu alebo vodu, a vedľa tohto bodu položíme vodnú dosku. Vodná guľa bude mať vysokú pravdepodobnosť vody vedľa vodnej dlaždice a nízku pravdepodobnosť trávovej dlaždice. Keď tieto rozdelenia elementárne vynásobíme, výsledkom bude vysoká pravdepodobnosť výskytu vody, pretože ide o súčin dvoch vysokých pravdepodobností, ale nízka pravdepodobnosť výskytu trávy, pretože je výsledkom vysokej pravdepodobnosti uloženej v mape s nízkou pravdepodobnosť uložená v guli.
Táto stratégia nám umožňuje efektívne aproximovať vplyv každého umiestnenia dlaždíc na mapu pravdepodobnosti.

Z hľadiska uspokojovania obmedzení

Aby sa efektívne vyriešili problémy s uspokojovaním obmedzení, je často rozumné sledovať tie priradenia k iným premenným, ktoré sa pri priraďovaní ku konkrétnej premennej stanú nemožné. Tento princíp sa nazýva zavedenie miestnych podmienok kompatibility. Zavedením nejakého druhu lokálnej kompatibility sa vyhnete priradeniu hodnoty premennej priradením nekompatibilnej hodnoty susednej premennej, keď bude potrebné vrátiť sa späť. Takéto transformácie spadajú do oblasti metód propagácie obmedzení v literatúre CLR. V našom algoritme rozšírime informácie na malú oblasť mapy zakaždým, keď umiestnime dlaždicu. Šírené informácie hovoria, ktoré dlaždice sa môžu a nemôžu objaviť v blízkosti. Napríklad, ak položíme horskú dlaždicu, potom vieme, že dve dlaždice od nej nemôže byť dlaždica otvoreného mora, to znamená, že pravdepodobnosť morskej dlaždice vo všetkých bodoch na mape dve dlaždice ďalej od umiestnenej dlaždice je nula. Tieto informácie sú zaznamenané v oblastiach, o ktorých sme hovorili vyššie. Gule kódujú miestnu kompatibilitu, ktorú chceme vnútiť.

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.

Manipulácia s obkladmi zmenou pravdepodobnosti výberu obkladov

Doteraz som hovoril len o tom, ako vytvárať správne obklady, no okrem správnosti sa od obkladu môžu vyžadovať aj iné vlastnosti. Môžeme napríklad chcieť určitý pomer jedného typu dlaždíc k druhému, alebo môžeme chcieť zabezpečiť, aby nie všetky dlaždice boli rovnakého typu, aj keď je obklad správny. Na vyriešenie tohto problému oba algoritmy, ktoré popisujem, berú ako vstup základnú pravdepodobnosť spojenú s každou dlaždicou. Čím vyššia je táto pravdepodobnosť, tým je pravdepodobnejšie, že táto dlaždica bude prítomná v hotovom obklade. Oba algoritmy robia náhodný výber z kolekcií dlaždíc a ja jednoducho pridám váhy k tomuto náhodnému výberu podľa základných pravdepodobností dlaždíc.

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.

Vytváranie vlastných dlaždíc

V skratke:
  • naklonujte moje úložisko github
  • nainštalovať Spracovanie
  • v priečinku data/ úložiska zmeňte dlaždice.png
  • pomocou spracovania otvorte wangTiles.pde a kliknite na tlačidlo prehrávania
S kódom zverejneným na githube (môžete ho upraviť, ale robíte to na vlastné riziko – väčšinu som napísal na strednej škole) si môžete vytvoriť svoje vlastné sady dlaždíc pomocou editora obrázkov a sledovať, ako s nimi riešiteľ dlaždíc vytvára svety. Stačí naklonovať úložisko a upraviť obrázok dungeon.png, potom pomocou spracovania spustite wangTiles.pde a pozrite si vygenerovanú animáciu mapy. Nižšie popíšem "jazyk", ktorý tento riešič obkladov vyžaduje.

Špecifikácia sady dlaždíc


Dlaždice sú usporiadané v rastri 4x4. Každá bunka v oblasti 3x3 vľavo hore obsahuje farebnú dlaždicu a zvyšných 7 pixelov obsahuje metadáta dlaždice. Pixel pod stredom dlaždice môže byť zafarbený červenou farbou, aby sa dlaždica okomentovala a vylúčila zo sady dlaždíc. Riešitelia to nikdy neuvedú na mapu. Horný pixel na pravej strane dlaždice môže byť natretý čiernou farbou, aby sa do sady dlaždíc pridali všetky štyri rotácie dlaždíc. Toto je užitočná funkcia, ak chcete pridať niečo ako uhol, ktorý existuje v štyroch orientáciách. Nakoniec najdôležitejšou časťou označenia je pixel v ľavej dolnej časti dlaždice. Riadi základnú pravdepodobnosť, že sa dlaždica objaví na mape. Čím je pixel tmavší, tým je pravdepodobnejšie, že sa dlaždica objaví.

Súvisiace práce

Mnoho ľudí preskúmalo Van's Tiles, čo sú sady dlaždíc s farebnými okrajmi a musia zodpovedať okrajom dlaždíc, vedľa ktorých sú umiestnené, rovnako ako dlaždice, na ktoré sa pozeráme.

Riešiteľ „Najobmedzenejšie umiestnenie s konzistenciou fuzzy oblúka“ je podobný projektu Wave Function Collapse používateľa služby Twitter.



Náhodné články

Hore