Mis on plaadid? Plaaditud graafika mängudes. Oma Tilemap mootor mustandites Liivakastist


(plaat - plaat) on sisuliselt loomise meetod suured maalid (pildid) kasutades väiksemaid elemente.

Üldiselt on midagi ilusat ja jälle mitte venekeelne sõna - mosaiik. Pidage meeles, mis see on. See on siis, kui panete tükkhaaval kokku suure pildi ja see on peaaegu sama, mis sukkpüksid. Või meenutage, kuidas nad raha lõikasid ja plaate panid.

// Siin on halb mõte ajaveebi teemasid segada...


Mis katus? Plaat. Imeline omadus: nimisõna saab muuta omadussõnaks, kuid siis ei saa seda normaalselt tõlkida, kuid sellest on lihtne aru saada.
Pöördume tagasi meie teema juurde, mängudes plaaditud graafika, mis see on?

See on graafika, mis koosneb plaatidest (Cap). Näide:


Mõnikord osutub see väga ilusaks


Need toolid ja laud on samuti plaadid. Plaadid on seinad, põrandad ja muud elemendid. Siinsed uksed pole tõenäoliselt plaadid, vaid esemed, kuna nendega on võimalik suhelda.

Samuti meenutab plaadigraafika põhimõtteliselt mõneti pikslikunsti, nagu ka mosaiik, joonistatakse pilti piksli haaval. Element elemendi haaval.


Rohkem pikslite kunsti siin


Aga sellel pildil (see pole üldse mäng), graafikat pole plaaditud. Kõik siin on joonistatud individuaalselt. Siin jõuame esimese probleemini plaaditud graafikaga – mõnikord ta näeb liiga üksluine välja.


Mängutegija stuudio plaatide standardnäide


Pidage meeles isegi StarCrafti kaardiredaktorit:


Ja siis lugege minu artiklit – kus ma temast kirjutasin. Esimeses vanamehes tehti seda kõike üsna uudishimulikult ja seal õnnestus osaliselt monotoonsusest üle saada, kuna peaaegu iga element genereeriti juhuslikult, isegi kui see oli sama tüüpi. Millest ma räägin?

Võtame sama ekraani ja suurendame seda.


Plaadid ei kordu


Ja millal see minu lemmik esimene StarCraft oli?

Jumal teab, millal, ja nad on selle asjaga juba välja mõelnud. Ja nüüd jätkavad mõned mängutegijad sama tüüpi plaatide ridadesse surumist.

Mängude graafika küsimus on väga oluline, kuna see määrab suuresti lõpliku eelarve ja arendusaja.

Töötate välja selliseid tööriistu nagu kaardiredaktor ja paned selle siis sinna, need juba korraldavad selle kõik ilusti ja arukalt. Mida rohkem tööriistu neil on, seda ilusam on, aga see on palju tööd.

Mitte ainult selle kõige joonistamiseks, vaid ka selle korraldamiseks ja seejärel elementide juhusliku jaotamiseks, kui seda kavatsetakse teha.

Kui soovite, et mäng oleks lõpuks ilusam, peate ühe puu jaoks joonistama mitu spraiti korraga. Ja ei, jõulupuu ja tamm on erinevad plaadid ja plaadid, need on eraldi. Korraga on vaja palju jõulupuid ja palju tammepuid.

Plaadid valmistatakse tavaliselt paki (komplektina), mida nimetatakse plaatide maatriksiks. See on suur fragment, mis on jagatud väiksemateks. Midagi sellist:



Ja nüüd võetakse sellest komplektist välja konkreetsed plaadid. See võib olla lihtsalt roheline ruut – muru, puu või midagi muud.

Siin on kõik üsna lihtne ja samal ajal ilus. Lume teema. Kui teil on valmis plaatide komplekt, olete juba poole tööst teinud, peate need lihtsalt kaunilt paigutama.

Plaadid on kergemad kui objektid, need on mängukiiruse jaoks paremad, need annavad teile parema FPS-i ja jõudluse, kui kasutate neid, mitte objekte. Spraitidega objekte on vaja ainult siis, kui nendega suhtlete. Oletame, et kui leegiheitja põletab metsa, siis jah, suure tõenäosusega peate objektist läbi puid tegema.

Kuid peaaegu kõik on dekoratiivsed (puht visuaalne) elemente saab teha läbi plaatide.

  • Loe ka:
Oletame, et need on samad sambad. Noh, miks on vaja kangelase ja sammaste vahelist suhtlust? Teil on vaja ainult kokkupõrget (kui te ei saa sellest läbi).

Ja kokkupõrke korral saate lihtsalt muuta tahke nähtamatu ala objektiks ja seejärel viia see samba alla. Siis läbi samba (sprite - plaat) möödasõit on võimatu, liikumist blokeerib "tahke" ala.

Aastal, mille kohta ma praegu videot teen, on ilmunud uued funktsioonid plaatidega töötamiseks, animeeritud plaadid. Samuti saate neile koodi kaudu helistada (ja eemaldada). Väga huvitav asi. Samuti saab seal nüüd plaate korraga partiidena paigutada ja kaardiruumi kiiresti plaatidega täita.

Üsna mugav, eriti väikeste plaatide jaoks.


Algajal, kes soovib mängutegijas mänge luua, pole põhimõtteliselt vaja klotse kasutada, sageli teevad algajad seda kõike (põld, puud jne) tavalised objektid spraitide ja jaoks lihtsad mängud see võib olla okei.

Aga kui otsustate teha RPG (või mõne muu žanri mäng) ilma graafikata vajate plaate. Loodan, et vastasin küsimusele - mis on plaadid ja tõin vastuvõetavaid näiteid plaatide graafikast mängudes.

Ja kui olete huvitatud konkreetsed näited ja kuidas see kõik GameMaker Studio 2-s töötab, näete minu video (9 minutit). Telli minu Econ Dude'i kanal – mängude loomisest nullist , kui te pole veel tellinud.

Mis on plaat
Tõenäoliselt on teil aimu, mis on plaat, kuid vaatame seda lähemalt. Plaat näeb välja nagu fikseeritud suurusega pilt. Pealegi on see joonistatud nii, et võrreldes teiste plaatidega saadakse üks pilt ilma märgatavate "õmblusteta". Lihtsaim viis plaatidest mõelda on seinte või põrandate katmiseks kasutatavate plaatidena. Lihtsaim plaat on ruudukujuline pilt, sümmeetriline vertikaalselt ja horisontaalselt (näete seda joonisel). Kui need pildid kokku panna, siis saad suur lõuend muru. Ja kui sellele lisada maaliline pilt vahelduseks veel üht tüüpi paani, mis kujutab teed, siis saab juba primitiivse kaardi teha.
Arvutame nüüd välja kulud, mida meilt nõutakse 512x512 lahtrite kaardi loomiseks. Oletame, et plaadi enda suurus on 32x32 pikslit, siis võtab see mälus 1024 baiti - 1 kilobait. Pärast arvutusi selgub, et kõige lihtsam kaart võtab mälus umbes 262 kilobaiti, millele lisandub mälu plaatide endi piltide salvestamiseks. Kui aga joonistaks sama suure ala käsitsi, peaksime tehnika arengu altarile panema 268 megabaiti (!). Ja seda hoolimata asjaolust, et võtsin lihtsuse huvides 256 värvi režiimi. On selge, et isegi praegu pole igal arvutil sellist mälumahtu, seega kasutatakse kaartide plaatide struktuuri valdavas enamuses kahemõõtmelistes ja piisavas koguses kolmemõõtmelistes mängudes.
Ristkülikukujulised ja ruudukujulised plaadid sobivad hästi linnulennult, kuid on ka teist tüüpi projektsioon, mida nimetatakse isomeetriaks. Seda kasutatakse siis, kui on vaja anda mahu, sügavuse tunnet, teha pseudo-3D. Seetõttu nimetatakse isomeetrilisi süsteeme mõnikord 2,5D-ks. Mis mõte siin on? Nüüd näeb paan vaataja poole ühe nurga all pööratuna ja justkui sügavamale (vaata illustratsiooni). Oma olemuselt kahemõõtmeline pilt saab kolmanda mõõtme. Sel juhul määratakse ruudu (plaadi) mõõtmed järgmiselt:
1. Pikkus – pildi vasakpoolseimast parempoolseima punktini.
2. Laius – vaatajale “kaugimast” kuni “lähima” punktini.
3. Kõrgus - plaadi "paksus".
Helitugevuse efekti loomiseks peaks laius olema ligikaudu pool pikkusest. Selle suhtega katsetades näib, et pöörate "plaati" kolmemõõtmelises ruumis, valides soovitud projektsiooni. Nendel eesmärkidel on kasulik kasutada mingit 3D-stuudio analoogi. Looge seal plaat, valige selle asukoht ja seejärel mõõtke küljed ja saadud suhted.
Aga kuidas ma saan nüüd joonistada?
selline plaat ekraanil? Tavalised joonistusfunktsioonid on ju harjunud, et neile antakse kuvamiseks ristkülikukujuline ala, mis neil väga hästi õnnestub. See probleem lahendatakse maskide abil. Illustratsioonil näete, et plaadi kontuurid langevad valgele alale ja väljapoole jääv värvitakse mustaks ja moodustab ristküliku. Selle tulemuseks on šablooni põhimõte: pilt kantakse maskile ja lõuendile ning ainult need punktid, mis jäävad valge värv. Isegi standardne Windowsi joonistamisfunktsioonid on selliste asjade tegemiseks koolitatud, rääkimata DirectX-i funktsioonidest. Samal ajal võimaldab maskide kasutamine luua muid efekte. Näiteks saate joonistada ainult plaadi pea, loobudes selle kõrgusest. Või tehke ainult ühe pildi abil erinevaid murulõike. Kui loome täielikult aukudest koosneva maski ja kasutame seda muruplaadi kuvamiseks olemasoleva erinevat tüüpi plaadi asemel, saame sujuva ülemineku ühelt pinnalt teisele. Sarnast tehnikat saab kasutada paljudel juhtudel ja "aukulisi" maske saab genereerida juhuslikult. Siis ei arva keegi, et teie maastik pole eelrenderdatud. Tulemuseks on omamoodi multitekstuur: kui kaks vastastikku läbipaistvat pilti asetatakse ühele alale. Tõsi, see võtab päris palju arvutiaega.
Kõige lihtsamal juhul on plaatide kõrgus null ja seda ei arvutata. Kui aga kasutada ainult selliseid “telliseid”, siis saavutame nende loomise parimal juhul meeldiv puhastus. Erinevaid kõrgusi kasutades saavutame realistlikuma maastiku, seinte ja küngastega. Muidugi on selliste "ehitusplokkide" kuvamine ekraanil keerulisem. Nüüd peaksime tutvuma plaadi baasjoone kontseptsiooniga.
Lähtejoon- see on koht, kus plaat puutub kokku maapinnaga. Need on pildil esile tõstetud roosa. Alusjoon võib asuda vertikaaljoonel ükskõik kus, sest sama pilti saab kasutada erineva suurusega seinte puhul. Seejärel kuvatakse plaatide paigutuse kaardil alusjooned ja plaate hakatakse joonistama kõrgemast positsioonist.

2Dfx

Oleme juba vaadanud, milliseid efekte saab luua mitme plaadikihi abil. Päris mängudes
kogu kaart on mitmekihiline, nagu vanasõna pirukas: esimene kiht- see on maa, kivid, muda, vesi jms; teine ​​kiht- mis tahes perifeeria, nagu puud, kivid, lauad ja toolid; kolmas kiht- objektid: inimesed, koletised, võtmed ja võlujoogid.
Ülaltoodud efektide jaoks saate lisada rohkem kihte, kuid tavaliselt kasutatakse parima jõudluse saavutamiseks nelja kuni viit. Näiteks saab meie skeemis lisada neljanda kihi, et luua objekte, mis asuvad tegelaste peade tasemest kõrgemal, näiteks majade katused. Olete kõik kohanud seda efekti: kui kangelane tuleb hoone lähedale, kaob ootamatult selle katus ja näete hoone sisemust. Seega on väga lihtne sundida plaadimootorit neljanda kihi joonistamist lõpetama, et kasutaja näeks kõike, mis selle all peidus on.
Plaatmootorid, mille graafika põhineb palettide põhimõttel, kasutavad aktiivselt värvide pööramise efekti. Olgu vee renderdamiseks kasutada teatud sinist gammat. Seejärel saate seda gammat muutes või, vastupidi, plaadis indekseid ümber korraldades, saada voolava vee efekti. Sama nipp kehtib ka teiste pindade puhul. Oletame, et koopas on plaadid, mis kujutavad kivi,
saab tumedamaks muuta. Ja kui annate tõrviku tegelase kätte ja valgustate olenevalt tema positsioonist ümbritsevat ala, on efekt väga ilus. Ma ei räägi isegi päeva ja öö dünaamilisest muutumisest. Palettide haldamine on väga huvi Küsi, lisaks väga hästi disainitud ja uuritud kokku 256 õitsemise perioodil, mil palettideta ei saanud keegi hakkama. Isegi praegu, kui alla 16-bitist värvi peetakse sündsusetuks, kasutatakse spraitide salvestamiseks omaformaate, mis põhinevad samadel palettidel.
Muide, kes ütles, et plaatide kuvamiseks peate kasutama häkitud DirectDraw protseduure? Muidugi, selleks pikka aega olemasolu, on algoritmid välja töötatud paljude efektide jaoks: dünaamiline valgustus ja isegi osakeste süsteemid. Kuid nad kõik töötavad väga aeglaselt. Kuid see pole 1996. aasta ja Voodoo Graphics on haruldane ainult seetõttu, et kõik on selle juba välja visanud. Seetõttu oleks väga ahvatlev kasutada 3D-kiirendi võimalusi igapäevaste vajaduste jaoks.
3D-teegid võivad aidata tekstureeritud hulknurkade (sama paanide) väljastamisel – see on 2D-protseduuride aeglasem punkt. Sel juhul on filtreerimine (teise nimega tekstuuride kunstiline hägustamine) iseenesestmõistetav fakt. Lisaks muutuvad kättesaadavaks kõik efektid, mis on saadaval ainult 3D-mängudes: valgus, läbipaistvus, varjud, valguse üleminekud jne. See teema on piisavalt huvitav, et sellega harjutada. See võib olla plaatidepõhiste mängude tulevik.

Kaartide loomine
Iga kaart on massiiv, mis määrab plaatide asukoha nende kihtidel ja parameetrid. Kõige lihtne kaart on MxN maatriks, kus iga element sisaldab tingimuslikult aktsepteeritud jada paani numbrit. Kui olete kunagi kasutanud 2D-strateegiat või RPG-kaardiredaktorit (või töötanud Photoshopis), saate selle idee hõlpsalt aru. Millal lisatakse uusi kihte, maatriks muutub keerulisemaks, tulemuseks on maatriksite komplekt (struktuur) ja mis tahes efektide kasutuselevõtuga saate oma kaardivormingu, mis võtab kettal rohkem kui ühe megabaidi.
Plaatidele ei pea andma järjekorranumbreid. Vastupidi, alustuseks oleks hea jagada kogu oma numbriseeria mitmeks intervalliks. Näiteks vahemik 0 kuni 63 sisaldab tavalisi plaate, millel saab kõndida (maapind, plaadid). 63–127 - läbimatud džunglitihnikud, seinad ja muud tahked esemed. Järgmine intervall on järvede ja soode veed ning lõpuks spetsiaalsed rühmad, mis sooritavad mis tahes toiminguid, kui kangelane neile "astub": portaalid, püünised jne. Nüüd, kui Photoshop toodab graafikat, määrate uutele tulijatele numbrid selle põhjal aktsepteeritud reeglid, ja tulevikus vabanete paljudest probleemidest, mis on seotud piirkonna läbitavuse määramisega või sellega, kuidas reageerida kangelase portaali sisenemisel.
Kaardi joonistamisel võib esialgu probleeme tekkida isomeetriliste plaatide joonistamisega, sest need on nii “kõverad”, et pole selge, kuhu ühte joonistada ja teist jätkata. Raskused võivad tekkida sujuva kerimise või kaardilõikude kärpimise programmeerimisel ekraani järgi. Muide, kõige parem on teha plaatide suurusi kahe võimsusega (16x16 või 32x32), see aitab arvutuste tegemisel oluliselt nii teid kui ka protsessorit.

Sama kehtib ka kaardi suuruse kohta. See peaks olema võimalikult ruudukujuline ja selle mõõtmed tuleks jagada komponendi "telliste" suuruseks. Nii ei teki arvutuste tegemisel kunagi murdväärtusi, millega on võimatu töötada. Seetõttu enamik kaarte mõõtmetega 128x128 või 512x512.
Muide, tähemärkide liigutamine isomeetrilisel kaardil juhtub samuti põhjusega. Lõppude lõpuks on meie kaart "sügavalt" pööratud ja selle absoluutne vertikaalne suurus on kaks korda väiksem kui horisontaalne. Seetõttu peab iga kõndiv objekt liikuma vastavalt "üles". Üldiselt tuleb siin rakendada valemeid, kuid kõige lihtsamal juhul on kahe astme jaoks küljele üks samm sügavuti. Kui olete huvitatud täpsetest arvutustest, on need Internetist hõlpsasti leitavad, äärmisel juhul küsige nõu. Sama kehtib mis tahes liikumise kohta isomeetrias, mis toimub isegi täiesti tasasel otsingul.
Õnneks pole kõiki neid küsimusi juba ammu väheuuritud tehnoloogiate hulka liigitatud ja Internetis on palju isomeetriliste 2D-mootorite programmeerimise õpikuid. Soovitan teil vaadata selliste saitide artiklite jaotist nagu www.gamedev.net Ja www.flipcode.com või lihtsalt söödake mõnele Yahoo-laadsele otsingumootorile vastavad märksõnad.

IsometriX

Noh, neile, kellele meeldib "programmidega nokitseda", panime spetsiaalselt kompaktsele mootorile nimega IsometriX. See akumuleerib kõike, mis eespool öeldi. Erinevalt enamikust 3D-mootoritest ja mängudisaineritest, mida on varasemas "Samopale"-s üle vaadatud, ei ole selle mootori eesmärk olla teie mängu aluseks. See on mõeldud eelkõige selleks, et saaksid praktikas näha, kuidas kõikvõimalikud teoreetilisi küsimusi lahendatakse. Mootor on täielikult sisse kirjutatud Visuaalne C++, sellel on lähtekood ja oma tasemeredaktor. Kui sa
Kui programmeerimine sind ei huvita, võid ikka ilma midagi kompileerimata testtasemel ringi seigelda.
Funktsioonide poolest võib IsometriX tunduda enam kui tagasihoidlik: 640x480 8-bitises värvitoonis pole see muidugi nii. Kuid nagu ma ütlesin, on see pigem näide, millest saate õppida kaartidega töötamist, tegelaste liigutamist, kokkupõrkeid kontrollima ja palju muud. Pealegi töötab kõik hästi operatsioonisüsteemis Windows 9x/2000 ja tõenäoliselt töötab ka XP-s.

Lahkumissõnana


Mida iganes nad ütlevad, kahemõõtmeline
plaadimootorid on tänapäevalgi kõige elavamad. Ükski 3D-mäng ei ole joonistamise detailide ja ilu poolest veel võrreldav klassikaliste 2D-mängudega. Võtke näiteks Fallout Tactics – see mäng kasutab ehk kõige progressiivsemaid saavutusi 2D valdkonnas. Ja selle mängu graafikat ei julgeks keegi kehvaks nimetada.
Lisaks sobivad plaadid ideaalselt tohutute maailmade loomiseks. Kui kaart on jagatud mitmeks osaks, millest igaüks on dünaamiliselt laaditud, segmenteerimise abil saate teha lihtsalt fantastilise suurusega kaarte. Ja seda kasutatakse aktiivselt RPG-mängudes. See on veel üks tegur, miks arendajad ei kiirusta kiirendite ja multitekstuuride maailma liikuma.
Ja lõpuks, plaaditud graafikat on palju lihtsam õppida kui mis tahes 3D-mootorit (kuigi see võib olla minu subjektiivne arvamus). Ja DirectDrawi õppimine spraitide juhtimiseks on võrreldamatult lihtsam ja selgem kui Direct3D ja isegi OpenGL. Seetõttu ärge püüdke tormata otse eesliinile. Võib-olla peaksite vaatama ka vana hea 2D-maailma. Noh, võib-olla natuke 2,5D...
  • Tõlge

Selles postituses kirjeldan kahte algoritmi keerukate protseduurimaailmade loomiseks lihtsatest värviliste paanide komplektidest ja põhinevad nende plaatide paigutuse piirangutel. Näitan, kuidas nende plaadikomplektide hoolika kujundamisega saate luua huvitavat protseduuriliselt loodud sisu, näiteks maastikke linnadega või keeruka sisestruktuuriga koopasse. Allolev video näitab süsteemi loomist protseduuriline maailm põhineb reeglitel, mis on kodeeritud 43 värvilisele plaadile.


Alloleval pildil on paanide komplekt, mille põhjal videost maailm genereeriti. Maailm on varustatud märkmetega, mis aitavad teil seda reaalses keskkonnas ette kujutada.


Plaatimist saame määratleda kui piiratud võrku, milles iga plaat on oma ruudustiku lahtris. Me defineerime õige maailma kui maailma, milles naaberplaatide servade värvid peaksid olema samad.
Plaatimisel on ainult üks asi raudne reegel: Plaadi servade värvid peavad ühtima. Sellest reeglist lähtudes kujuneb välja kogu kõrgetasemeline struktuur.

Õige plaat näeb välja selline:

See on plaat, mis peaks näitama kaarti vee, rannikute, rohu, hoonetega linnade (sinised ristkülikud) ja lumiste tippudega mägedega. Mustad jooned näitavad plaatide vahelisi piire.

Ma arvan, et see on huvitav viis maailmade kirjeldamiseks ja loomiseks, sest väga sageli kasutavad protseduurilised genereerimisalgoritmid ülalt-alla lähenemisviisi. Näiteks L-süsteemides kasutatakse objekti rekursiivset kirjeldust, milles kõrgetasemelised suured detailid määratakse varem kui madalad. Selles lähenemisviisis pole midagi halba, kuid minu arvates on huvitav luua plaatide komplekte, mis suudavad kodeerida ainult lihtsaid madala taseme suhteid (nt. merevesi ja muru tuleks eraldada rannajoontega, hoonetel peaksid olema ainult kumerad nurgad 90-kraadise nurga all) ja jälgige kõrgetasemeliste mustrite (nt ruudukujuliste hoonete) tekkimist.

Plaatimine on NP-täieliku piiranguga rahulolu probleem

Piirangutega rahuloluprobleemidega (CSP) tuttava lugeja jaoks on juba ilmne, et piiratud maailma plaadistamine on CSP. VMA-s on meil palju muutujaid, palju väärtusi, mida iga muutuja võib võtta (nimetatakse selle domeeniks) ja palju piiranguid. Meie puhul on muutujad kaardil koordinaadid, iga muutuja määratlusala on paanide komplekt ja piirangud on, et plaatide servad peavad vastama nende naabrite servadele.

Intuitiivselt on mittetriviaalse plaadistuse õige loomine keeruline, kuna plaatide komplektid võivad kodeerida suvalisi ulatuslikke sõltuvusi. Kui vaadelda plaatide komplekti kui tervikut, siis formaalsest vaatepunktist on tegemist NP-täieliku piiranguga rahulolu probleemiga. Naiivne plaatimisalgoritm koosneb ammendavast plaatimisruumi otsingust ja töötab eksponentsiaalses ajas. On lootust, et suudame luua huvitavad maailmad plaatide komplektide põhjal, lahendatud otsinguga, mida saab kiirendada heuristika abil. Teine võimalus on luua plaate, mis on ligikaudu õiged, kuid sisaldavad väikest arvu valesid asukohti. Leidsin kaks algoritmi, mis mõne huvitava plaadikomplektiga hästi töötavad, ja kirjeldan neid allpool.

1. meetod: ahne paigutus tagasisuunaliste harudega

Valime juhuslikud kohad ja asetame sinna sobivad plaadid. Kui jääme jänni, kustutame mõned neist ja proovime uuesti.

Muutke kogu kaart LAHENDAMATA

Kuigi kaardil on LAHENDAMATA plaate
kui kaardile saab panna mõne sobiva plaadi
t<- коллекция всех возможных расположений подходящих тайлов
l<- случайная выборка из t, взвешенная по вероятностям тайлов
koht l kaardil
muidu
vali juhuslik plaat LAHENDAMATA ja määra kõigile selle naabritele olek LAHENDAMATA


Minu esimene katse luua paanikomplektist plaati oli see, et kogu ruudustik oleks lahendamata ja seejärel paigutasin juhuslikult sobivasse kohta juhusliku plaadi või kui sobivaid kohti polnud, määrasin väikese ala plaadi kõrvale. lahendamata plaat "lahendamata" olekusse. ja jätkas ahnelt plaatide paigutamist. "Greedy Layout" on strateegia plaatide paigutamiseks seni, kuni selle servad ühtivad juba asetatud plaatidega, olenemata sellest, kas selline paigutus loob osalise plaatimise, mida ei saa lõpule viia ilma juba asetatud plaate asendamata. Kui selline olukord tekib ja me ei saa enam plaate paigutada, peame eemaldama mõned varem asetatud plaadid. Kuid me ei tea, milliseid on kõige parem eemaldada, sest kui saaksime probleemi lahendada, saaksime tõenäoliselt lahendada ka plaatide õige paigutuse. Et anda algoritmile veel üks võimalus antud ala jaoks sobiva plaadi leidmiseks, seame kõik lahendamata punkti ümbritsevad plaadid olekusse "lahendamata" ja jätkame ahne paigutusstrateegiaga. Loodame, et varem või hiljem leitakse õige plaatimine, kuid garantiid pole. Algoritm töötab seni, kuni leitakse õige plaat, mis võib võtta lõpmatult aega. See ei suuda tuvastada, et plaadikomplekt on lahendamatu.

Ei ole mingit garantiid, et algoritm oma töö lõpule viib. Lihtne paanikomplekt, milles on kaks paani, millel pole ühtki värvi, viib algoritm lõpmatusse tsüklisse. Veelgi lihtsam juhtum oleks üks plaat, mille peal ja all on erinevad värvid. Oleks mõistlik leida viis, kuidas tuvastada, et plaadikomplektid ei suuda luua korralikke plaate. Võime öelda, et plaatide komplekt on kindlasti õige, kui see suudab plaatida lõpmatu tasapinna. Mõnel juhul on lihtne tõestada, et plaatide komplekt võib või ei pruugi lõpmatu tasapinna plaatida, kuid üldiselt on see probleem lahendamatu. Seetõttu on disaineri ülesanne luua plaatide komplekt, mis suudab luua õige plaadistuse.

See algoritm ei suuda postituse alguses olevast videost leida häid lahendusi koopasse plaadikomplektile. See toimib hästi lihtsamate plaatide komplektidega. Soovime õppida lahendama keerukamaid plaatide komplekte, millel on palju võimalikke üleminekuid plaatide vahel ja erinevad kodeeritud reeglid (näiteks et teed peaksid algama ja lõppema hoonete kõrval).

Vajame algoritmi, mis vaatab tulevikku ja loob plaatide paigutusi, olles samal ajal teadlikud viisidest, kuidas need paigutused on tulevaste plaatide paigutuste jaoks avatud. See võimaldab meil tõhusalt lahendada keerukaid plaatide komplekte.

Seoses piirangute rahuldamisega

See algoritm sarnaneb tagurpidi otsimisega. Igas etapis proovime määrata ühe muutuja. Kui me ei saa, siis tühistame muutuja ja kõigi sellele piirangutega seotud muutujate määramise. Seda nimetatakse "tagasihüppamiseks" ja see erineb tagasiteest, kus me tühistame ühe muutuja määramise korraga, kuni saame jätkata õigete määramiste tegemist. Tagasi minnes tühistame muutujate määramise üldjuhul nende määramise vastupidises järjekorras, tagasi minnes aga määramise tühistame vastavalt kõnealuse ülesande struktuurile. On loogiline, et kui me ei saa ühtegi plaati kindlasse kohta paigutada, siis peame muutma naaberplaatide asukohta, kuna nende paigutus on tekitanud lahendamatu olukorra. Selle asemel tagasi minnes võime tühistada muutujate määramise, mis on üksteisest ruumiliselt kaugel, kuid mis olid hiljuti määratud.

See otsing ei kasuta kohalikke terviklikkuse meetodeid. See tähendab, et me ei proovi paigutada paanide paigutusi, mis viivad hiljem lahendamatu olukorrani, isegi üks otsingusamm hiljem. Otsingut on võimalik kiirendada, jälgides mõju, mida asukoht avaldab võimalikele asukohtadele, mis on praegusest punktist mitu paani eemal. Loodetavasti väldib see seda, et otsing ei pea kulutama oma töö tühistamisele nii palju aega. See on täpselt see, mida meie algoritm teeb.

2. meetod: kõige piirangutega asukoht ja kohaliku teabe levitamine

Säilitame plaatide tõenäosusjaotuse igas punktis, tehes asukoha otsustamisel nendes jaotustes mittekohalikud muudatused. Me ei lähe kunagi tagasi.
Järgmisena kirjeldan algoritmi, mis on garanteeritud lõpuleviimiseks ja annab kõigi testitud plaatide jaoks visuaalselt meeldivamad tulemused. Lisaks saab see luua peaaegu õigeid plaate palju keerukamate plaadikomplektide jaoks. Kompromiss seisneb selles, et see algoritm ei garanteeri, et väljund on alati õige plaat. Jaotises Optimeeringud kirjeldatakse optimeerimisi, mis võimaldavad sellel algoritmil kiiremini töötada isegi suuremate paanide komplektide ja kaartidega.

Õige plaadistuse loomise raskus sõltub suuresti üleminekute arvust, mis on vajalik kahe plaaditüübi vahel liikumiseks. Lihtne plaadikomplekt võib sisaldada ainult liiva, vett ja muru. Kui rohi ja vesi ei saa teineteist puudutada, peab nende vahel olema üleminek liivale. See on lihtne näide, mida saab hõlpsasti lahendada varem esitatud algoritmi abil. Keerulisemal juhul võib esineda mitu sisseehitatud plaaditüüpi. Näiteks võib meil olla sügav vesi, vesi, liiv, rohi, kõrge tasandik, mägi ja lumine tipp. Kõikide seda tüüpi plaatide kaardil kuvamiseks peab olema seitse üleminekut, eeldades, et need tüübid ei saa üksteist puudutada, välja arvatud minu määratud järjekorras. Täiendavat keerukust saab lisada plaatide loomisega, mis loovad loomulikult ulatuslikud sõltuvused plaatide vahel, näiteks teed, mis peavad algama ja lõppema teatud tüüpi plaatide läheduses.

Intuitiivselt peaks selle ülesande algoritm suutma "ette vaadata" ja kaaluma vähemalt mitut üleminekut, mis võivad olla valitud asukoha tagajärjed. Selle rakendamiseks võite mõelda paanide kaardile kui paanide tõenäosusjaotusele igas punktis. Kui algoritm asetab paani, värskendab see tõenäosusjaotust selle paani ümber vastavalt selle asukohale nii, et see suurendab naaberpaanide tõenäosust, mis tõenäoliselt ühilduvad praeguse paigutusega.

Näiteks kui kaardil on veeplaat, siis peavad selle kõrval olevad plaadid sisaldama vett. Nende kõrval olevad plaadid võivad samuti sisaldada vett, kuid on ka teisi võimalusi, näiteks muru, kui esialgse veeplaadi kõrvale asetada rannik. Mida kaugemale paigutatud plaadist liigume, seda rohkem on võimalikud plaaditüübid. Selle tähelepaneku ärakasutamiseks võime kokku lugeda, mitu võimalust jõuame iga plaadi asukohta algse paani kõrval. Mõnel juhul võib ainult üks üleminekute jada viia ühelt paanilt teisele teatud vahemaa piires. Muudel juhtudel võib olla palju erinevaid üleminekujadasid. Pärast plaadi asetamist saame määrata plaatide tõenäosusjaotused naaberpunktides, loendades viise, kuidas saame üle minna paigutatud plaadilt naaberplaatidele. Selle algoritmi "ettevaatamine" eesmärk on jälgida sellist üleminekute arvu ja käsitleda neid tõenäosusjaotustena, millest saab valida paigutamiseks uued paanid.


Algoritm uurib igas etapis kõiki lahendamata paanide asukohti, millest igaühel on tõenäosusjaotus paanide vahel, ja valib ühe koha, mida paanile „koonduda”. See valib jaotuse kaardilt minimaalse entroopiaga. Madala entroopiaga multinoomsete jaotuste tõenäosused on tavaliselt koondunud mõnesse režiimi, nii et nende esimeste koondumine põhjustab plaatide asukohtade mõju, millel on juba mõned piirangud. Seetõttu asetab algoritm plaadid nende plaatide kõrvale, mille me esimesena lahendasime.

See on kõige tõhusam algoritm, mida olen suutnud selle ülesande jaoks rakendada. Sellel on veel üks eelis: see loob täitmisel ilusaid visualiseeringuid. Võib-olla on võimalus seda algoritmi täiustada, juurutades mingisuguse tagasiliikumise. Kui valminud plaadistuses on vale punkt, võib naaberplaatide asukohtade tühistamine ja saadud jaotustest nende punktides uuesti proovide võtmine võimaldada sellele viimistletud plaadistusele paranduse leida. Muidugi, kui soovite otsingut jätkata kuni õige plaadistuse leidmiseni, ületate määratud garanteeritud teostusaja.

Optimeerimised

Selle meetodi kõige olulisem toiming on positsioneeritud paani ümber olevate tõenäosuste värskendamine. Üks võimalus oleks lugeda võimalikud üleminekud paigutatud paanilt välja iga kord, kui paani asetatakse. See on väga aeglane, kuna iga kaardipunkti puhul, kuhu uued tõenäosused levivad, tuleb arvestada paljude üleminekupaaridega. Ilmne optimeerimine oleks mitte levida kogu kaardile. Huvitavam optimeerimine oleks vahemällu salvestada mõju, mida iga paanide paigutus seda ümbritsevatele punktidele avaldab, nii et iga paanide paigutus teeb lihtsalt otsingu, et kontrollida, milliseid muudatusi see paigutus läheduses asuvates tõenäosustes teeb, ja seejärel rakendab selle muudatuse mõned lihtsad toimingud. Allpool kirjeldan selle optimeerimismeetodi rakendamist.

Kujutage ette paani, mis on asetatud täiesti tühjale kaardile. See paigutus värskendab naaberplaatide tõenäosust. Võime vaadata neid värskendatud distributsioone, millel on eelmiste paani asukohtade eelmine jaotus. Kui asetatakse mitu paani, jagatakse seda eelmist jaotust. Ma lähendan seda tagumist tõenäosust, võttes arvesse eelmist liigendit jaotuste korrutisena iga asukoha kohta minevikus.


Selle rakendamiseks kujutan ette, et kui paan asetatakse tühjale kaardile, muudab see olulisi muudatusi kaardil naaberpunktide jaotuses. Ma kutsun neid uuendusi sfäär plaat ehk selle ümber projitseeritud plaadi mõjusfäär, kui see asetatakse tühjale kaardile. Kui kaks paani asetatakse kõrvuti, siis nende sfäärid suhtlevad ja loovad lõplikud jaotused, mida mõlemad paigutused mõjutavad. Arvestades, et paljud plaadid võivad asuda antud lahendamata asukoha lähedal, on palju vastastikku toimivaid piiranguid, mistõttu on loenduspõhine otsus, et määrata kindlaks erinevate plaatide sel hetkel ilmumise tõenäosus, väga aeglane protsess. Mis siis, kui selle asemel kaaluksime vaid lihtsat interaktsiooni mudelit juba kaardil asuvate plaatide eelarvutatud sfääride vahel?
Paani paigutamisel värskendan iga elemendi tõenäosuskaarti, korrutades selle paani sfäärilise jaotuse igas kaardipunktis selles kaardipunktis juba salvestatud jaotusega. Võib olla kasulik vaadata näidet selle kohta, mida see jaotuskaardiga teha saab. Oletame, et antud kaardi punktil on praegu jaotus, mis valib sama suure tõenäosusega rohu või vee, ja asetame selle punkti kõrvale veeplaadi. Vesiplaadi sfääril on suur tõenäosus, et vesi on veeplaadi kõrval, ja väike tõenäosus, et muruplaat. Kui me korrutame need jaotused elementide kaupa, on tulemuseks vee tõenäosus suur, kuna see on kahe suure tõenäosuse korrutis, kuid rohu tõenäosus muutub väikeseks, kuna see on suure tõenäosuse korrutis, mis on kaardile salvestatud sfääri salvestatud väikese tõenäosusega.
See strateegia võimaldab meil tõhusalt ligikaudselt hinnata mõju, mida iga paani asukoht peaks tõenäosuskaardile avaldama.

Seoses piirangute rahuldamisega

Piirangutega rahulolu probleemide tõhusaks lahendamiseks on sageli mõistlik jälgida nende määramist teistele muutujatele, mis muutuvad konkreetsele muutujale määramisel võimatuks. Seda põhimõtet nimetatakse kohalike ühilduvustingimuste kehtestamiseks. Mingisuguse kohaliku ühilduvuse juurutamine väldib muutujale väärtuse määramist, samas kui külgnevale muutujale ühildumatu väärtuse määramist, kui on vaja tagasi minna. Sellised teisendused kuuluvad CCD-teemalise kirjanduse piirangute levitamise meetodite valdkonda. Meie algoritmis jagame teabe kaardi väikesele alale iga kord, kui paneme paani. Jagatav teave ütleb teile, millised plaadid võivad läheduses ilmuda ja millised mitte. Näiteks kui asetame mäeplaadi, siis teame, et avatud mereplaat ei saa olla sellest kahe plaadi kaugusel, st tõenäosus, et merepaan asub kõigis kaardi punktides, mis asuvad asukohast kahe plaadi kaugusel, on null . See teave on salvestatud valdkondades, millest me eespool rääkisime. Sfäärid kodeerivad kohalikku ühilduvust, mida tahame kehtestada.

Vähendades külgnevatele paanidele võimalike määramiste arvu, vähendame oluliselt otsinguruumi, mida algoritm peab pärast iga määramist töötlema. Teame, et selles väikeses naabruskonnas on asukohaga mitteühilduvate plaatide ilmumise tõenäosus null. See on analoogne nende väärtuste eemaldamisega nendes punktides muutujate ulatustest. See tähendab, et igal naaberpunktide paaril asuvat paani ümbritsevas piirkonnas on oma määratlusalal kindel paan, mis ühildub mõne plaadiga, mis asub endiselt naabrite määratlusalal. Kui kaks muutujat on piiranguga ühendatud CR-probleemiks ja nende domeenid sisaldavad ainult väärtusi, mis vastavad piirangule, siis väidetakse, et neil on kaare ühilduvus, mis tähendab, et see meetod on tegelikult tõhus strateegia kaare ühilduvuse juurutamiseks.

PCA-s on antud osalise määramise "kõige piiratum" muutuja see, mille määratluspiirkonnas on jäänud kõige vähem väärtusi. Paani paigutamise põhimõte kaardil minimaalse entroopiajaotusega punkti sarnaneb väärtuse määramisega SDC-s kõige piiratumale muutujale, mis on standardne heuristika muutujate järjestamiseks SDC lahendamisel otsingu abil.

Plaatimisega manipuleerimine, muutes plaatide valiku tõenäosusi

Siiani olen rääkinud vaid õigete plaatide loomisest, kuid peale korrektsuse võib plaatimine nõuda ka muid omadusi. Näiteks võime soovida teatud tüüpi plaatide ja teiste plaatide vahekorda või tagada, et kõik plaadid ei oleks sama tüüpi, isegi kui see plaat on õige. Selle probleemi lahendamiseks võtavad mõlemad minu kirjeldatud algoritmid sisendiks iga paaniga seotud baastõenäosuse. Mida suurem on see tõenäosus, seda tõenäolisemalt on see plaat valmis plaadistuses olemas. Mõlemad algoritmid teevad juhuslikke valikuid paanide kogumitest ja ma lihtsalt lisan sellele juhuslikule valikule kaalu vastavalt aluseks olevatele paanide tõenäosustele.

Selle põhimõtte näide on toodud allpool. Tahke veeplaadi ilmumise tõenäosust muutes saan juhtida kaardil veekogude suurust ja sagedust.

Looge oma plaadikomplektid

Lühidalt:
  • klooniks mu githubi hoidla
  • installige töötlemine
  • muutke hoidla andmete/kaustas tiles.png
  • kasutage töötlust, et avada wangTiles.pde ja klõpsake esitusnupul
Kasutades githubi postitatud koodi (saate seda muuta, kuid tehke seda omal riisikol – suurema osa sellest kirjutasin ma keskkoolis), saate luua pildiredaktoriga oma plaatide komplekte ja jälgida, kuidas plaatide lahendaja loob maailmu neid. Lihtsalt kloonige hoidla ja redigeerige dungeon.png pilti, seejärel kasutage käsku Töötlemine, et käivitada wangTiles.pde ja näha loodud kaardianimatsiooni. Allpool kirjeldan "keelt", mida see plaatide lahendaja nõuab.

Plaatide komplekti spetsifikatsioon


Plaadid on paigutatud 4x4 ruudustikuna. Igas vasakpoolses ülanurgas olevas 3x3 lahtris on värviline paan ja ülejäänud 7 pikslit sisaldavad paani metaandmeid. Paani keskosa all oleva piksli saab värvida punaseks, et paani kommenteerida ja see paanikomplektist välja jätta. Lahendajad ei pane seda kunagi kaardile. Paani paremal küljel asuva ülemise piksli saab värvida mustaks, et lisada plaadikomplekti kõik neli plaadi pöörlemist. See on mugav funktsioon, kui soovite lisada midagi nurgataolist, mis eksisteerib neljas suunas. Lõpuks on märgistuse kõige olulisem osa paani vasakus alanurgas olev piksel. See juhib plaadi kaardil ilmumise baastõenäosust. Mida tumedam on piksel, seda suurem on paani ilmumise tõenäosus.

Seotud teosed

Paljud inimesed on uurinud Van Tiles'i, mis on värviliste servadega plaadikomplektid ja mis peavad sobima nende servadega plaatidega, mille kõrvale need asetatakse, täpselt nagu meie vaadeldavad plaadid.

Lahendaja "Kõige piiratum paigutus hägusa kaare konsistentsiga" sarnaneb Twitteri kasutaja Wave Function Collapse projektiga

Mis on plaat
Tõenäoliselt on teil aimu, mis on plaat, kuid vaatame seda lähemalt. Plaat näeb välja nagu fikseeritud suurusega pilt. Pealegi on see joonistatud nii, et võrreldes teiste plaatidega saadakse üks pilt ilma märgatavate "õmblusteta". Lihtsaim viis plaatidest mõelda on seinte või põrandate katmiseks kasutatavate plaatidena. Lihtsaim plaat on ruudukujuline pilt, sümmeetriline vertikaalselt ja horisontaalselt (näete seda joonisel). Kui need pildid kokku panna, saad suure murulõuendi. Ja kui lisada sellele maalilisele pildile mitmekesisuse huvides teist tüüpi paanid, näiteks teed kujutavad, saate juba luua primitiivse kaardi.
Arvutame nüüd välja kulud, mida meilt nõutakse 512x512 lahtrite kaardi loomiseks. Oletame, et plaadi enda suurus on 32x32 pikslit, siis võtab see mälus 1024 baiti - 1 kilobait. Pärast arvutusi selgub, et kõige lihtsam kaart võtab mälus umbes 262 kilobaiti, millele lisandub mälu plaatide endi piltide salvestamiseks. Kui aga joonistaks sama suure ala käsitsi, peaksime tehnika arengu altarile panema 268 megabaiti (!). Ja seda hoolimata asjaolust, et võtsin lihtsuse huvides 256 värvi režiimi. On selge, et isegi praegu pole igal arvutil sellist mälumahtu, seega kasutatakse kaartide plaatide struktuuri valdavas enamuses kahemõõtmelistes ja piisavas koguses kolmemõõtmelistes mängudes. Lihtne ristkülikukujuline plaat.
Ristkülikukujulised ja ruudukujulised plaadid sobivad hästi linnulennult, kuid on ka teist tüüpi projektsioon, mida nimetatakse isomeetriaks. Seda kasutatakse siis, kui on vaja anda mahu, sügavuse tunnet, teha pseudo-3D. Seetõttu nimetatakse isomeetrilisi süsteeme mõnikord 2,5D-ks. Mis mõte siin on? Nüüd näeb paan vaataja poole ühe nurga all pööratuna ja justkui sügavamale (vaata illustratsiooni). Oma olemuselt kahemõõtmeline pilt saab kolmanda mõõtme. Sel juhul määratakse ruudu (plaadi) mõõtmed järgmiselt:
1. Pikkus – pildi vasakpoolseimast parempoolseima punktini.
2. Laius – vaatajale “kaugimast” kuni “lähima” punktini.
3. Kõrgus - plaadi "paksus".
Helitugevuse efekti loomiseks peaks laius olema ligikaudu pool pikkusest. Selle suhtega katsetades näib, et pöörate "plaati" kolmemõõtmelises ruumis, valides soovitud projektsiooni. Nendel eesmärkidel on kasulik kasutada mingit 3D-stuudio analoogi. Looge seal plaat, valige selle asukoht ja seejärel mõõtke küljed ja saadud suhted.
Aga kuidas ma saan nüüd joonistada? Lihtne isomeetriline plaat. selline plaat ekraanil? Tavalised joonistusfunktsioonid on ju harjunud, et neile antakse kuvamiseks ristkülikukujuline ala, mis neil väga hästi õnnestub. See probleem lahendatakse maskide abil. Illustratsioonil näete, et plaadi kontuurid langevad valgele alale ja väljapoole jääv värvitakse mustaks ja moodustab ristküliku. Saadakse šablooni põhimõte: pilt kantakse maskile ja “lõuendile” ning läbi lähevad ainult need punktid, mis jäävad valgeks. Isegi Windowsi standardsed joonistamisfunktsioonid on selliste asjade tegemiseks koolitatud, rääkimata DirectX-i funktsioonidest. Samal ajal võimaldab maskide kasutamine luua muid efekte. Näiteks saate joonistada ainult plaadi pea, loobudes selle kõrgusest. Või tehke ainult ühe pildi abil erinevaid murulõike. Kui loome täielikult aukudest koosneva maski ja kasutame seda muruplaadi kuvamiseks olemasoleva erinevat tüüpi plaadi asemel, saame sujuva ülemineku ühelt pinnalt teisele. Sarnast tehnikat saab kasutada paljudel juhtudel ja "aukulisi" maske saab genereerida juhuslikult. Siis ei arva keegi, et teie maastik pole eelrenderdatud. Tulemuseks on omamoodi multitekstuur: kui kaks vastastikku läbipaistvat pilti asetatakse ühele alale. Tõsi, see võtab päris palju arvutiaega.
Kõige lihtsamal juhul on plaatide kõrgus null ja seda ei arvutata. Kui aga kasutada ainult selliseid “telliseid”, siis saavutame parimal juhul meeldiva lagendiku. Erinevaid kõrgusi kasutades saavutame realistlikuma maastiku, seinte ja küngastega. Muidugi on selliste "ehitusplokkide" kuvamine ekraanil keerulisem. Nüüd peaksime tutvuma plaadi baasjoone kontseptsiooniga.
Lähtejoon- see on koht, kus plaat puutub kokku maapinnaga. Pildil on need roosaga esile tõstetud. Alusjoon võib asuda vertikaaljoonel ükskõik kus, sest sama pilti saab kasutada erineva suurusega seinte puhul. Seejärel kuvatakse plaatide paigutuse kaardil alusjooned ja plaate hakatakse joonistama kõrgemast positsioonist.

2Dfx

Oleme juba vaadanud, milliseid efekte saab luua mitme plaadikihi abil. Päris mängudes Nii arvutatakse plaatide suurused. kogu kaart on mitmekihiline, nagu vanasõna pirukas: esimene kiht- see on maa, kivid, muda, vesi jms; teine ​​kiht- mis tahes perifeeria, nagu puud, kivid, lauad ja toolid; kolmas kiht- objektid: inimesed, koletised, võtmed ja võlujoogid.
Ülaltoodud efektide jaoks saate lisada rohkem kihte, kuid tavaliselt kasutatakse parima jõudluse saavutamiseks nelja kuni viit. Näiteks saab meie skeemis lisada neljanda kihi, et luua objekte, mis asuvad tegelaste peade tasemest kõrgemal, näiteks majade katused. Olete kõik kohanud seda efekti: kui kangelane tuleb hoone lähedale, kaob ootamatult selle katus ja näete hoone sisemust. Seega on väga lihtne sundida plaadimootorit neljanda kihi joonistamist lõpetama, et kasutaja näeks kõike, mis selle all peidus on.
Plaatmootorid, mille graafika põhineb palettide põhimõttel, kasutavad aktiivselt värvide pööramise efekti. Olgu vee renderdamiseks kasutada teatud sinist gammat. Seejärel saate seda gammat muutes või, vastupidi, plaadis indekseid ümber korraldades, saada voolava vee efekti. Sama nipp kehtib ka teiste pindade puhul. Oletame, et koopas on plaadid, mis kujutavad kivi, Plaat ja tema mask. Ekraanile joonistades
nähtav on ainult see osa, mis langeb valgesse
maski piirkond. saab tumedamaks muuta. Ja kui annate tõrviku tegelase kätte ja valgustate olenevalt tema positsioonist ümbritsevat ala, on efekt väga ilus. Ma ei räägi isegi päeva ja öö dünaamilisest muutumisest. Palettide haldamine on väga huvitav teema, lisaks oli see väga hästi arendatud ja uuritud kogu 256 õitsemise perioodil, mil ilma palettideta ei saanud keegi hakkama. Isegi praegu, kui alla 16-bitist värvi peetakse sündsusetuks, kasutatakse spraitide salvestamiseks omaformaate, mis põhinevad samadel palettidel.
Muide, kes ütles, et plaatide kuvamiseks peate kasutama häkitud DirectDraw protseduure? Muidugi on pika eksisteerimisperioodi jooksul välja töötatud algoritme paljude efektide jaoks: dünaamiline valgustus ja isegi osakeste süsteemid. Kuid nad kõik töötavad väga aeglaselt. Kuid see pole 1996. aasta ja Voodoo Graphics on haruldane ainult seetõttu, et kõik on selle juba välja visanud. Seetõttu oleks väga ahvatlev kasutada 3D-kiirendi võimalusi igapäevaste vajaduste jaoks.
3D-teegid võivad aidata tekstureeritud hulknurkade (sama paanide) väljastamisel – see on 2D-protseduuride aeglasem punkt. Sel juhul on filtreerimine (teise nimega tekstuuride kunstiline hägustamine) iseenesestmõistetav fakt. Lisaks muutuvad kättesaadavaks kõik efektid, mis on saadaval ainult 3D-mängudes: valgus, läbipaistvus, varjud, valguse üleminekud jne. See teema on piisavalt huvitav, et sellega harjutada. See võib olla plaatidepõhiste mängude tulevik.

Kaartide loomine
Iga kaart on massiiv, mis määrab plaatide asukoha nende kihtidel ja parameetrid. Lihtsaim kaart on MxN maatriks, kus iga element sisaldab tavapäraselt aktsepteeritud jada paani numbrit. Kui olete kunagi kasutanud 2D-strateegiat või RPG-kaardiredaktorit (või töötanud Photoshopis), saate selle idee hõlpsalt aru. Millal Identsed plaadid võivad olla erineva kõrgusega,
kui kasutatakse baasmeetodit. lisatakse uusi kihte, maatriks muutub keerulisemaks, tulemuseks on maatriksite komplekt (struktuur) ja mis tahes efektide kasutuselevõtuga saate oma kaardivormingu, mis võtab kettal rohkem kui ühe megabaidi.
Plaatidele ei pea andma järjekorranumbreid. Vastupidi, alustuseks oleks hea jagada kogu oma numbriseeria mitmeks intervalliks. Näiteks vahemik 0 kuni 63 sisaldab tavalisi plaate, millel saab kõndida (maapind, plaadid). 63–127 - läbimatud džunglitihnikud, seinad ja muud tahked esemed. Järgmine intervall on järvede ja soode veed ning lõpuks spetsiaalsed rühmad, mis sooritavad mis tahes toiminguid, kui kangelane neile "astub": portaalid, püünised jne. Nüüd, kui Photoshop toodab graafikat, määrate uutele tulijatele aktsepteeritud reeglite alusel numbreid ja olete tulevikus vabanenud paljudest probleemidest, mis on seotud piirkonna läbitavuse määramisega või sellega, kuidas reageerida kangelase portaali sisenemisel.
Kaardi joonistamisel võib esialgu probleeme tekkida isomeetriliste plaatide joonistamisega, sest need on nii “kõverad”, et pole selge, kuhu ühte joonistada ja teist jätkata. Raskused võivad tekkida sujuva kerimise või kaardilõikude kärpimise programmeerimisel ekraani järgi. Muide, kõige parem on teha plaatide suurusi kahe võimsusega (16x16 või 32x32), see aitab arvutuste tegemisel oluliselt nii teid kui ka protsessorit. Sama kehtib ka kaardi suuruse kohta. See peaks olema võimalikult ruudukujuline ja selle mõõtmed tuleks jagada komponendi "telliste" suuruseks. Nii ei teki arvutuste tegemisel kunagi murdväärtusi, millega on võimatu töötada. Seetõttu on enamiku kaartide mõõtmed 128x128 või 512x512.
Muide, tähemärkide liigutamine isomeetrilisel kaardil juhtub samuti põhjusega. Lõppude lõpuks on meie kaart "sügavalt" pööratud ja selle absoluutne vertikaalne suurus on kaks korda väiksem kui horisontaalne. Seetõttu peab iga kõndiv objekt liikuma vastavalt "üles". Üldiselt tuleb siin rakendada valemeid, kuid kõige lihtsamal juhul on kahe astme jaoks küljele üks samm sügavuti. Kui olete huvitatud täpsetest arvutustest, on need Internetist hõlpsasti leitavad, äärmisel juhul küsige nõu. Sama kehtib mis tahes liikumise kohta isomeetrias, mis toimub isegi täiesti tasasel otsingul.
Õnneks pole kõiki neid küsimusi juba ammu väheuuritud tehnoloogiate hulka liigitatud ja Internetis on palju isomeetriliste 2D-mootorite programmeerimise õpikuid. Soovitan teil vaadata selliste saitide artiklite jaotist nagu www.gamedev.net Ja www.flipcode.com või lihtsalt söödake mõnele Yahoo-laadsele otsingumootorile vastavad märksõnad.

IsometriX

Noh, neile, kellele meeldib "programmidega nokitseda", panime spetsiaalselt kompaktsele mootorile nimega IsometriX. See akumuleerib kõike, mis eespool öeldi. Erinevalt enamikust 3D-mootoritest ja mängudisaineritest, mida on varasemas "Samopale"-s üle vaadatud, ei ole selle mootori eesmärk olla teie mängu aluseks. See on mõeldud eelkõige selleks, et saaksid praktikas näha, kuidas kõikvõimalikud teoreetilisi küsimusi lahendatakse. Mootor on täielikult sisse kirjutatud Visuaalne C++, sellel on lähtekood ja oma tasemeredaktor. Kui programmeerimine sind ei huvita, võid ikka ilma midagi kompileerimata testtasemel ringi seigelda.
Funktsioonide poolest võib IsometriX tunduda enam kui tagasihoidlik: 640x480 8-bitises värvitoonis pole see muidugi nii. Kuid nagu ma ütlesin, on see pigem näide, millest saate õppida kaartidega töötamist, tegelaste liigutamist, kokkupõrkeid kontrollima ja palju muud. Pealegi töötab kõik hästi operatsioonisüsteemis Windows 9x/2000 ja tõenäoliselt töötab ka XP-s.

Lahkumissõnana
Mida iganes nad ütlevad, kahemõõtmeline plaadimootorid on tänapäevalgi kõige elavamad. Ükski 3D-mäng ei ole joonistamise detailide ja ilu poolest veel võrreldav klassikaliste 2D-mängudega. Võtke näiteks Fallout Tactics – see mäng kasutab ehk kõige progressiivsemaid saavutusi 2D valdkonnas. Ja selle mängu graafikat ei julgeks keegi kehvaks nimetada.
Lisaks sobivad plaadid ideaalselt tohutute maailmade loomiseks. Kui kaart on jagatud mitmeks osaks, millest igaüks on dünaamiliselt laaditud, segmenteerimise abil saate teha lihtsalt fantastilise suurusega kaarte. Ja seda kasutatakse aktiivselt RPG-mängudes. See on veel üks tegur, miks arendajad ei kiirusta kiirendite ja multitekstuuride maailma liikuma.
Ja lõpuks, plaatide graafikat on palju lihtsam õppida kui mis tahes 3D-mootorit (kuigi see võib olla minu subjektiivne arvamus). Ja DirectDrawi õppimine spraitide juhtimiseks on võrreldamatult lihtsam ja selgem kui Direct3D ja isegi OpenGL. Seetõttu ärge püüdke tormata otse eesliinile. Võib-olla peaksite vaatama ka vana hea 2D-maailma. Noh, võib-olla natuke 2,5D...

Selles artiklis õpetan teile, kuidas luua tasemeid peaaegu iga žanri mängude jaoks ja muuta nende arendamine palju lihtsamaks. Loome plaatide kaardimootori, mida saate oma projektides kasutada. Kasutame Haxe'i ja OpenFL-i, kuid loomisprotsess on paljude keelte puhul sarnane.

Natuke sellest, mida artiklis kirjeldatakse

  • Mis on klotsipõhine mäng?
  • Looge või otsige oma "plaate"
  • Koodi kirjutamine taseme kuvamiseks
  • Taseme redigeerimine

Mis on klotsipõhine mäng?

Muidugi leiate paanigraafika määratluse Wikipediast, kuid selleks, et mõista, mis see on, peate mõistma vaid mõnda asja
  • Plaat - väike pilt, tavaliselt ristkülikukujuline, mis toimib suurte piltide konstrueerimisel pusletükina
  • Kaart – rühmitatud paanide rühm
  • Paanipõhine viitab mängude tasemete loomise meetodile. Kood asetab plaadid eelnevalt määratletud asukohtadesse
Meie artiklis on plaadid ristkülikukujulised. Paanide graafika abil saate mõned lahedad funktsioonid. Kõige lahedam on see, et iga taseme jaoks pole vaja suuri pilte joonistada. Viiskümmend 1280 x 768 pikslit pilti 50-tasemelise mängu jaoks võrreldes ühe saja paaniga pildiga on tohutu erinevus. Veel üks eelis on see, et elementide paigutamine paangraafika abil muutub märgatavalt lihtsamaks.

Looge või otsige paanid

Esimene asi, mida vajate mootori ehitamiseks, on plaatide komplekt. Teil on kaks võimalust: kasutage valmis plaate või tehke ise. Kui otsustate kasutada valmiskujutisi, saate neid hõlpsalt leida kõikjalt Internetist. Negatiivne külg on see, et seda graafikat ei tehtud spetsiaalselt teie mängu jaoks. Teisest küljest, kui te lihtsalt eksperimenteerite, on see valik üsna sobiv.

Ma arvan, et plaatide leidmine ei tohiks olla probleem, nii et ma ei hakka sellel üksikasjalikult peatuma.

Plaatide loomine
Piltide loomise hõlbustamiseks on palju suurepäraseid tööriistu. Paljud arendajad kasutavad neid tööriistu oma töös.

Need on pikslikunsti loomise kõige populaarsemad tööriistad. Kui vajate midagi võimsamat, siis GIMP on ideaalne.

Kui olete programmi valinud, võite alustada katsetamist oma plaatidega. Kuna see artikkel näitab teile, kuidas luua oma plaatide graafikamootorit, ei hakka ma plaatide enda kohta üksikasjalikult rääkima.

Koodi kirjutamine

Kui meil on kõik vajalik, saame sukelduda otse programmeerimisse.
Kuvage ekraanil üks paan
Alustame kõige lihtsamast ülesandest, ühe paani kuvamisest ekraanil. Veenduge, et kõik teie pildid oleksid ühesuurused ja salvestatud erinevatesse failidesse (räägime spraitide ühes failis salvestamisest hiljem).

Kui kõik plaadid on teie projekti varade kaustas, saate kirjutada lihtsa paanide klassi. Siin on näide Haxe kohta
import flash.display.Sprite; import flash.display.Bitmap; import openfl.Varad; klass Tile laiendab Sprite'i ( privaatne var image:Bitmap; avalik funktsioon new() ( super(); pilt = new Bitmap(Assets.getBitmapData("assets/grassLeftBlock.png")); addChild(image); ) )
Nüüd ei tee muud, kui asetame plaadi ekraanile. Ainus, mida klass teeb, on kujutise importimine varade kaustast ja selle lisamine alamobjektina. Kuidas see klass välja näeb, sõltub suuresti kasutatavast programmeerimiskeelest.

Nüüd, kui meil on Tile klass, peame looma Tile eksemplari ja lisama selle oma põhiklassi.
import flash.display.Sprite; import flash.events.Event; import flash.Lib; klass Main laiendab Sprite'i ( avalik funktsioon new() ( super(); var tile = new Tile(); addChild(tile); ) avalik staatiline funktsioon main() ( Lib.current.addChild(new Main()); ) )
Põhiklass loob konstruktori kutsumisel uue Tile objekti ja lisab selle kuvamisloendisse.

Kui mäng algab, kutsutakse välja funktsioon main() ja lavale lisatakse uus Main tüüpi objekt. Pange tähele, et teie uus paan kuvatakse ekraani vasakus ülanurgas.

Massiivide kasutamine kõigi plaatide kuvamiseks
Järgmine samm on leida meetod kõigi plaatide kuvamiseks. Lihtsaim meetod on täita massiiv numbritega, millest igaüks vastab paanile. Seejärel korrake lihtsalt kõiki massiivi elemente ja kuvage need.

Meil on valida: kasutada tavalist massiivi või maatriksit. Kui te pole maatriksitega tuttav, siis lihtsalt teadke, et tegemist on massiiviga, mis sisaldab rohkem massiive. Enamik programmeerimiskeeli tähistab seda nimega nameOfArray[x][y].

Koordinaatidena kasutame ekraanil X ja Y. Võib-olla saame kasutada neid X ja Y oma plaatide kuvamiseks? Nii et heidame pilgu maatriksile
private var exampleArr = [ , , , ,
Pange tähele, et selle massiivi nullelement on viiest numbrist koosnev massiiv. See tähendab, et saate kõigepealt elemendi y ja seejärel x. Kui proovite elementi võtta, saate juurdepääsu kuuendale paanile.

Kui te ei saa aru, kuidas maatriksid töötavad, ärge muretsege. Selles artiklis kasutan meie ülesande lihtsustamiseks tavalist massiivi.
privaatne vari näideArr = [ 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 ];
Ülaltoodud näide näitab, et tavalise massiivi kasutamine on palju lihtsam. Konkreetse elemendi saame kuvada, arvutades lihtsa valemi abil koordinaadid.

Nüüd kirjutame koodi, mis loob meie massiivi. Täidame selle 1-ga. Number üks tähendab meie esimese paani ID-d.

Massiivi salvestamiseks peame põhiklassis looma muutuja
privaatne var kaart: Array ;
See võib tunduda veidi kummaline, nii et ma selgitan.
Muutuja nimi on map ja tüüp Array. tähendab, et massiiv sisaldab numbreid.
Nüüd lisame oma klassi konstruktorile koodi, et meie kaart lähtestada
kaart = uus massiiv ();
See koodilõik loob tühja massiivi, mille täidame peagi. Kuid kõigepealt deklareerime mõned muutujad, mis aitavad meid matemaatikaga.
avalik staatiline var TILE_WIDTH = 60; avalik staatiline var TILE_HEIGHT = 60; avalik staatiline var SCREEN_WIDTH = 600; avalik staatiline var SCREEN_HEIGHT = 360;
Need muutujad on avalikud staatilised, et saaksime neile juurdepääsu kõikjal meie programmis. Võib-olla olete märganud, et nende arvude põhjal otsustame, mitu lahtrit massiivi salvestada.
var w = Std.int(EKRAANI_LAAIUS / PLAANI_LAAIUS); var h = Std.int(EKRAANI_KÕRGUS / PLAANI_KÕRGUS); jaoks (i in 0...w * h) (kaart[i] = 1)
Siin määrame muutuja w väärtuseks 10 ja h jaoks 6, nagu ma ütlesin. Järgmisena peame massiivi läbima, et mahutada 10 * 6 numbrit.

Nüüd on meil lihtne kaart, kuid me peame plaadid õigesti paigutama, eks? Selleks läheme tagasi Tile klassi ja loome funktsiooni, mis võimaldab seda teha
avalik funktsioon setLoc(x:Int, y:Int) ( pilt.x = x * Main.TILE_WIDTH; image.y = y * Main.TILE_HEIGHT; )
Funktsiooni setLoc() kutsumisel edastame x- ja y-koordinaadid. Funktsioon võtab need väärtused ja teisendab need pikslikoordinaatideks, korrutades TILE_WIDTH ja TILE_HEIGHT

Ainus asi, mida teha jääb, on põhiklassis kirjeldada plaatide loomise ja paigutamise protsessi kaardil
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 (plaat);)
Jah! Kõik on õige. Ekraan on täidetud plaatidega. Saame aru, mis ülal toimub

Valem
Arutleme ülalmainitud valemi üle.

Arvutame x, andes sellele jäägi, kui i jagatakse w-ga. Seda tehakse, et tagastada x iga rea ​​alguses väärtusele 0.

y puhul võtame floor() alates i/w.

Lõpetuseks tahaksin veidi rääkida taseme kerimisest. Tavaliselt ei saa te luua taset, mis mahuks täielikult ekraanile. Teie kaardid on ekraanist märgatavalt suuremad, seega pole vaja joonistada seda osa kaardist, mida kasutaja ei näe. Seda saab parandada sama matemaatika abil. Peate loendama, millised klotsid on ekraanil nähtavad ja millised mitte.

Näiteks: ekraan on 500x500 ja paanid 100x100 ning teie maailm on 1000x1000. Enne plaadi joonistamist peate tegema lihtsa kontrolli.

Peame vaid looma erinevat tüüpi plaate ja kuvama midagi ilusat.

Erinevat tüüpi plaadid
Olgu, nüüd on meil kaart täis identseid elemente. Oleks tore, kui meil oleks rohkem kui üks elemenditüüp, mis tähendab, et peame muutma oma konstruktorit klassis Tile
avalik funktsioon new(id:Int) ( super(); switch(id) ( juhtum 1: pilt = new Bitmap(Assets.getBitmapData("assets/grassLeftBlock.png")); juhtum 2: pilt = new Bitmap(Assets. getBitmapData("assets/grassCenterBlock.png")); juhtum 3: pilt = new Bitmap(Assets.getBitmapData("assets/grassRightBlock.png")); juhtum 4: pilt = new Bitmap(Assets.getBitmapData/gold("asset) .png")); juhtum 5: pilt = new Bitmap(Assets.getBitmapData("assets/globe.png")); juhtum 6: pilt = new Bitmap(Assets.getBitmapData("assets/mushroom.png")); ) lisalaps(pilt); )
Nüüd on meil kuus erinevat tüüpi plaate. Mul on kuvatava pildi valimiseks vaja lüliti konstruktsiooni. Võib-olla olete märganud, et konstruktor võtab nüüd parameetrina numbri, mis näitab plaadi tüüpi.

Pöördume tagasi põhiklassi konstruktori juurde ja redigeerime oma tsüklit
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); lisalaps(plaat); )
Ainus muudatus on see, et anname nüüd ploki tüübi konstruktorile. Kui prooviksite programmi ilma selle muudatuseta käivitada, lõppeks see veaga.

Nüüd on kõik paigas, kuid me peame välja mõtlema kaardi kujunduse, selle asemel, et seda juhuslike plokkidega täita. Esmalt eemaldage põhikonstruktorist silmus, mis täidab massiivi samadega. Ja seejärel looge kaart käsitsi
kaart = [ 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];
Kui vormindate massiivi, nagu mina tegin, näete hõlpsalt taseme ligikaudset välimust. Kuid keegi ei keela teil massiivi lihtsalt ühele reale täita.

Programmi käivitamisel näete mitmeid tõrkeid. Probleem on selles, et meie kaart sisaldab nullploki tüüpi, millel pole pilti ja meie klass lihtsalt ei tea, mida sellega peale hakata. Parandame selle arusaamatuse
if (pilt != null) addChild(pilt);
See lühike kontroll päästab meid tüütu nullkursori vea eest. Viimane muudatus mõjutab funktsiooni setLoc(). Püüame kasutada muutujaid x ja y, mida pole lähtestatud
avalik funktsioon setLoc(x:Int, y:Int) ( if (pilt != null) ( pilt.x = x * Main.TILE_WIDTH; image.y = y * Main.TILE_HEIGHT; ) )
Tänu neile kahele lihtsale tingimusele saate nüüd mängu alustada ja näha lihtsat taset. Me tajume plaate, mille ID on 0, tühja ruumina. Lisage veidi tausta. et see atraktiivsem välja näeks.

Järeldus

Olete just loonud muinasjutupõhise mootori. Nüüd teate, mis on plaatide graafika ja kuidas seda kasutada. Olete õppinud tasemete loomist ja muutmist. Kuid ärge lõpetage sellega, meie mootoris on veel nii palju täiustada.
Toimetaja valik
Esitluse eelvaadete kasutamiseks looge Google'i konto ja logige sisse:...

William Gilbert sõnastas umbes 400 aastat tagasi postulaadi, mida võib pidada loodusteaduste peamiseks postulaadiks. Vaatamata...

Juhtimise funktsioonid Slaidid: 9 Sõnad: 245 Helid: 0 Efektid: 60 Juhtimise olemus. Põhimõisted. Haldushalduri võti...

Mehaaniline periood Aritmomeeter - arvutusmasin, mis teeb kõik 4 aritmeetilist tehtet (1874, Odner) Analüütiline mootor -...
Esitluse eelvaadete kasutamiseks looge Google'i konto ja logige sisse:...
Eelvaade: esitluse eelvaadete kasutamiseks looge Google'i konto ja...
Esitluse eelvaadete kasutamiseks looge Google'i konto ja logige sisse:...
1943. aastal küüditati Karachais'd ebaseaduslikult nende sünnikohtadest. Üleöö kaotasid nad kõik – oma kodu, kodumaa ja...
Meie veebisaidil Mari ja Vjatka piirkondadest rääkides mainisime sageli ja. Selle päritolu on salapärane, pealegi on marid (ise...