Ruudukko-pohjainen reittihaku | hyperPad Documentation

Loading...

Logo

Tässä oppaassa teemme reitin löytämisimulaation, joka perustuu 2-ulotteiseen taulukkoon. Tämä antaa meille perusajatuksen reitin löytämistoimintojen luomiseksi peleihimme. Visualisoimme taulukon käyttäen tyhjiä neliöobjekteja laattana ja pyöreää objektia avataarina, joka voi liikkua tällä taulukolla meidän komennostamme.

Video_2019-07-30__2_32_01_PM.gif

I. Asettelu objekteista

Käytämme projektissamme vain neljää objekti. Meidän vihreä avataari, sininen laatta, valkoinen este ja taulukon etiketti taulukkomme asettamista ja visualisoimista varten.

Photo_2019-07-29__1_50_10_PM.png

Avataari

Avataarimme on tyhjät objektit, joissa on x- ja y-mittakaava 50%. Ole sen törmäysasetukset pyöreä muoto, jotta se näyttäisi sellaiselta kuin kuvassa alla. Tällä objektilla on kolme ennalta määritettyä attribuuttia: laatalla, edellisellä laattalla ja tavoite laatalla. Aseta näiden attribuuttien oletusarvot nollaksi, jotta niillä ei ole tyhjää arvoa, kun yritämme saada niitä myöhemmin.

Photo_2019-07-29__1_53_38_PM.png

Laattakohta

Luo toinen tyhjät objekti, jota käytetään visualisoimaan laattoja taulukossamme. Sen mittakaava on myös 50% ja sillä on vain yksi ennalta määritetty attribuutti: laatalla. Aseta myös tämä arvo nollaksi.

Photo_2019-07-29__1_53_51_PM.png

Este objekti

Luo toinen tyhjät objekti, joka toimii esteinä taulukossamme. Tämä on valkoinen tyhjät objekti, jonka mittakaava on 40%. Avataarimme ei voi ylittää laattalavaa, jolla on este sen päällä.

Taulukon etiketti

Tämä on vain etiketti, joka sisältää käyttäytymisiä, jotka mahdollistavat taulukon asettamisen ja visualisoimisen. Sen ennalta määritetyt attribuutit: alku x-arvo on 4, ja alku y-arvo on 3. Nämä arvot ovat offset-arvoja, joita käytetään viitteenä laattujen syntyessä järjestämään taulukko siististi keskelle.

Photo_2019-07-29__1_56_01_PM.png

Avataari/Laattakohtaiset ennalta määritetyt attribuutit:

Määrittelemme laatan täällä 2-kokoisena taulukkona, joka sisältää x- ja y-arvon taulukkomme perusteella.

  • laatta - tämä on laatta-arvo, jolla objektimme tällä hetkellä on taulukossamme
  • edellinen laatta - laatta, jota avataarimme on aiemmin ylittänyt
  • tavoite laatta - laatta, johon avataarimme menee

II. Taulukon asettaminen

Taulukon etiketin sisällä määritämme 2D-taulukkona ja taulukkomme syntymisen. Tässä objektissa on 2 pääkohtaa: taulukon asettaminen ja taulukon visualisoiminen. Tehdään ensin taulukon asetuspakkaus.

Photo_2019-07-29__3_05_10_PM.png

Aseta taulukko - pakkaus

Ensinnäkin luo tyhjät taulukko nimeltä 'Grid'. Tämä taulukko sisältää meidän 2-ulotteisen taulukon. Meillä on laatikkokontti nimeltä 'x rivin määrä', jossa on arvo 24, ja toinen tyhjät taulukko nimeltä 'y rivi', jossa on 18 tyhjää arvoa.

Photo_2019-07-29__1_55_28_PM.png

Paketin ensimmäinen käyttäytyminen on silmukka, jossa on toistokertoja 'x rivin määrä'. Jokaisessa silmukkavaiheessa lisäämme tyhjät y-rivi 'Grid-taulukkoon'. Tämä luo taulukon taulukossa, jonka mitat ovat 24x18.

Huomaa, että olemme liittäneet inaktiivisen kommentin paketin alkuun kieltääksemme tämän juurikäyttäytymisen automaattisen suorittamisen. Juurikäyttäytyminen on käyttäytyminen, joka ei käynnisty minkään tapahtuman perusteella ja on sijoitettu avoimesti käyttöliittymään.

Visualisoi taulukko - pakkaus

Pääasiassa teemme täällä, on kulkea läpi jokaisen 'Grid-taulukon' arvon ja syntetisoida laattaobjekti. Lisätään myös silmukkaan ehto, joka mahdollistaa valkoisen esteen syntymisen laattaobjektin päälle.

Photo_2019-07-29__3_56_37_PM.png

Ensin saamme 'y rivin taulukon' laskennan, tämän objektin 'alku x' attribuutin arvon ja 'alku y:n'.

Luo silmukka, jossa on toistofrekvenssi 'x rivin määrä', ja jokaisessa silmukkavaiheessa lisää indeksiarvo laattamoodin arvon ja 'alku x' attribuutin arvon. Tämä tuloksena on absoluutinen x-asema, jota käytämme syntenoimaan laatat myöhemmin. Seuraavaksi 'y rivin silmukka', joka toistuu 'y rivin määrä'. Jokaisessa silmukkavaiheessa lisää indeksiarvo silmukassa ja 'alku y' attribuutin arvo, jolloin saadaan nyt absoluutinen y-asema.

Photo_2019-07-29__4_03_51_PM.png

Kun olemme lisänneet arvot 'y rivin silmukassa', syntettään sinistä objektia. Aseta sen elävien objektien määrä 999:ksi, koska tarvitaan paljon niitä taulukkoamme varten, ja myös kesto on 0. Siirrä sitten syntetty objekti x-pisteeseen, jonka arvo tulee y-loopista 'lisää arvot', ja y-pisteeseen, jonka arvo tulee y-loopista 'lisää arvot'.

Seuraavaksi lisää 2 tyhjällä arvolla oleva taulukko nimeltä 'On tile', jota käytämme vain taulukon paikkana. Laattaobjektin siirron jälkeen muokkaa 'On tile' taulukkoa korvaamalla sen arvo indeksissä 0 arvolla 'x rivin silmukasta'. Lisää sitten toinen taulukon muutos, joka korvataan indeksissä 1 arvolla 'y rivin indeksi'. Tämä on x- ja y-koordinaatit taulukostamme, joilla objektilla on 'on tile' attribuutti.

Nyt aseta syntettyjen objektien attribuuttien dynaamiseen avaimen tyyliin 'on tile', ja arvolla 'On tile - taulukko'.

Photo_2019-07-29__4_41_55_PM.png

Yhä 'y rivin silmukassa' on valintatyö, joka syntyy valkoisena esteenä. Meillä on 2/5 mahdollisuus toteuttaa tämä pakettia, mikä lisää taulukkomme satunnaisuutta. Seuraavaksi merkitään arvo 1 tämän koordinaatin x- ja y-koordinaatille 'Grid' taulukkomme, mikä kertoo meille, että koordinaattiin on syntynyt este.

Ensinnäkin on saatava satunnainen numeerinen luku 1 ja 5. Jos luku on pienempi tai yhtä suuri kuin 2, syntyy este. Aseta sen 'elävien objekti' lukumäärä 999 ja siirrä objekti samaan kohtaan niille siniselle laatalle, jonka aikaisemmin syntetimme, ja myös kestoon 0.

Seuraavaksi tallennamme, että tämä koordinaatti oli esteen peitossa, jos se syntyi. Teemme tämän merkkaamalla koordinaatti arvoon 1. Ensinnäkin on saatava arvo indeksissä 'x rivin silmukassa' 'Grid' taulukosta. Tämä arvo antaa meille 'y rivin' taulukon. Muokataan tätä 'y riviä' korvaamalla sen arvo indeksissä 'y rivin silmukka' arvolla 1, joka on merkkiväri. Koska tämä arvojen muutos koskee vain tuota arvoa eikä 'Grid'ta, meidän on silti muokattava ‘Grid’ taulukkojamme. Korvataan arvo indeksissä 'x rivin silmukka' Grid-taulukossa arvolla 'muokattu y taulukko'.

Kun peliä pelataan, sen pitäisi aiheuttaa tämänkaltaista muotoa.

Photo_2019-07-29__4_45_18_PM.png

III. Laattapainallus

Voidaksesi olla vuorovaikutuksessa itse taulukon kanssa, tarvitsemme pakettikäyttäytymisen, aina kun painamme sinistä laattaa. Ensimmäinen painallus tuo esiin avataarimme taulukossamme, ja kaikki peräkkäiset painallukset tämän jälkeen aloittavat sen reitin löytämisen.

Sinisen objektin sisällä on käyttäytymispaketti, jolla on 3 pääkohtaa: nollaa avataaremme edellinen laatta, aseta sen laatta/aseta sen kohdelaita, ja aseta värien animaatio visualisoimaan kosketustapahtumaa näytöllä.

Photo_2019-07-29__5_00_44_PM.png

Ensinnäkin saamme laatan objektin 'laatta' attribuutin. Aseta avataarin 'edellinen laatta' attribuutti nollaksi. Avataarimme asetetaan välttämään paluuta 'edelliselle laatalle', niin nollaamme 'edellisen laatan' jokaisella laattapainalluksena.

Seuraavaksi saamme avataarimme 'laatta' attribuutin. Ensimmäinen ehto on, onko 'laatta'- arvo nolla. Tämä tarkoittaa, että jos avataara ei ole vielä näkynyt, tämä koskee totta. Jos tämä on totta, asetamme sen 'laatta' attribuuttimme samaksi kuin laatan objektin 'laatta' attribuutti. Sitten siirrämme avataarin sijaintia saaden laatan objektin sijainnin, jolloin x- ja y-arvot osoittavat kyseiseen pistettä kesto on 0.

Jos 'laatta'-arvo ei ole yhtä suuri kuin nolla, asetamme avataarimme 'tavoite laatta' attribuuttimme laatan objektin 'laatta' attribuutin arvoksi. Tämä tarkoittaa, että avataarimme sijaitsee jo taulukossamme, ja voimme kansanapittyä toimintopakettia 'löydä reitti'. Meillä ei vielä ole tätä käyttäytymistä, mutta korjaamme tämän taas myöhemmin tutoriaalimme jälkeen 'löydä reitti' - pakettia varten.

Nyt kun olemme kunnolla asettaneet avataarimme taulukkoomme, visualisoimme vain tämän painallustapahtuman. Ensinnäkin haemme juurikäyttäytymisen 'hae väri' saadaksemme alkuperäisen värin. Sitten kaikki painallustapahtuman jälkeen asetamme laatan objektin värin mustaksi 0:n kestolla, sen jälkeen asetamme värin takaisin alkuperäiseen arvoon 0.2:n keston aikana.

Painallus siniselle laatalle pitäikkö seurata tällaista.

Photo_2019-07-30__1_04_42_PM.png

IV. Suorita Löydä Reitti Paketti

Tässä viimeisessä osassa oppaamme teemme algoritmin, joka mahdollistaa meille löytää lähimmän laatan, jonka avataarimme voi ottaa, jotta pääsee määränpäähänsä. Tämä paketti suoritetaan toistuvasti jokaiselle laatan vaiheelle, jonka avataarimme siirtyy taulukossamme.

Asetamme algoritmin avataarimme objektiin, jossa on kolme pääkohtaa: vierekkäisten laattojen löytäminen, lähimmän vierekkäisen laatan löytäminen, ja liikkuminen siihen vierekkäiseen laattaan.

Photo_2019-07-29__5_39_25_PM.png

Vierekkäisten laattojen löytäminen

Tässä osassa keräämme kaikki vierekkäiset laatat, joihin avataarimme voi kulkea. Tarkastamme sen neljä suuntavierekkäistä laattojen ja katsomme, onko jokaisessa näistä laattoista este päällä tai onko niitä aiemmin astuttu.

Photo_2019-07-29__5_40_24_PM.png

Ensinnäkin lisätään omat 'Vierekkäiset laatat' taulukkomme. Suuntataulukko (Direction) kahdella tyhjällä arvolla, ja neljä suunta-vaikuttavaa taulukoa, joilla on 2 arvoa jokaisessa: N(0,1), S(0,-1), E(1,0), W(-1,0).

Paketin ensimmäinen käyttäytyminen on puhdistaa vierekkäiset laatat. Koska toistamme pakettia toistuvasti, meidän on nollattava kerätyt 'vierekkäiset laatat' joka kerta. Seuraavat neljä käyttäytymistä ovat muokkauksia suuntataulukoon. Asetamme suuntataulukko neljä kertaa neljä suuntataulukkoa, ja sitten suoritamme alla olevan paketin. Teemme tämän, jotta voimme luoda silmukan eri 'Suunta'-taulukkoarvoilla joka kerta.

Photo_2019-07-29__6_04_42_PM.png

Kun meillä on suunta, yhdistämme vain heidän x- ja y-arvojensa avataarimme 'on tile' attribuuttin. Me saamme kohteeksi 'Grid' taulukosta tietoa, tietääksemme onko se laatta merkitty esteeksi.

'Suunta x' on suunta-taulukon arvosta indeksissä 0, 'hae laatan x' on 'hae laatan' arvosta indeksissä 0. Kohteeksi x on suunta x + hae laatan x. Samanlainen on y-arvojen kanssa, jota käytämme kohteen indeksi 1.

'Target y row' on 'Grid' taulukon massan arvot indeksissä 'kohde x'. Sitten 'Target index y row' on 'Target y row' arvot indeksissä 'kohteen y'. Tämä on koordinaatti taulukossamme, joka voi kertoa meille, onko se merkitty esteeksi.

Photo_2019-07-29__6_17_41_PM.png

Jos 'Kohde indeksi y-kohdassa' arvo on 1, se tarkoittaa, että kohde laatta on varattu. Mutta jos arvo ei ole 1, voimme jatkaa pakettiimme.

Koska kohde x ja y täyttänyt ehtomme, lisäsimme nyt uuden tyhjällä laatalla nimeltä 'Uusi vierekkäinen laatoitus'. Tähän saa tallennettua kohde x ja y arvot laattana. Asetetaan kohde x saamaan indeksissä 0 'Uusi vierekkäinen laatta', ja kohteen y indeksissä 1.

Saadaan avataarimme 'edellinen laatta'-attribuutista. Jos 'edellinen laatta' ei ole yhtä suuri kuin 'uusi vierekkäinen laatoitus', se tarkoittaa, että uusi laatta ei ole ollut aiemmin astuttu. Sitten voimme turvallisesti lisätä 'Uuden vierekkäisen laatan' 'Vierekkäiset laatat'-taulukkoon liittämällä sen. Asetamme 'edellisen laatan' arvon myöhemmin sen jälkeen, kun olemme onnistuneesti siirtäneet avataarimme uudelle laattalle.

"Voit laajentaa tätä pakettia tekemällä 8 suuntaista taulukot, joka mahdollistaa avataarimme liikkua diagonaalisesti."

Löydä lähin vierekkäinen laatta

Nyt kun olemme keränneet luotettavampia vierekkäisiä laattoja, meidän on vain saatava vierekkäinen laatta, joka on lähinnä avataarimme kohdetehtävää. Suoritamme laskentatoimen avulla etäisyyskaavaa, jossa käytetään kohteet valinta arvoja x ja y.

On kaksi keskeistä kohtaa tässä paketissa: muuttujien alustaminen laskennalle ja laattujen etäisyyksien laskeminen silmukassa.

a. Muuttujien alustaminen

Ensinnäkin saamme vierekkäisten laattojen määrä. Sitten saamme avataarimme 'tavoite laatan' attribuutin ja sen x- ja y-arvot. Lisätään 2 uutta laatikkokonttia: 'Minimi etäisyys' ja 'Kohde laatan indeksi'. Asetamme 'Minimi etäisyys' alkuarvo 9999, ja 'Kohde laatan indeksi' arvoon 0. Minimi etäisyys asetetaan korkeaksi, koska tarvitsemme vähimmän etäisyyden alusta. Kohde- laatan indeksi on viittausindeksi 'Vierekkäiset laatat'-taulukossa, jossa on vähin etäisyys 'tavoite laattaan'.

Pääasiallinen tavoite täällä on saada indeksi laatta 'Vierekkäiset laatat'-taulukosta, joka on lähinnä 'kohteita laattaa'.

Photo_2019-07-29__6_47_43_PM.png

b. Laattojen etäisyyksien laskeminen

Tässä paketissa teemme laskentaa silmukkaan, jota teemme jokaiselle vierekkäiselle laatalle. Silmukka toistuu 'vierekkäisten laattojen määrää' ja saamme laatan arvon 'Vierekkäiset laatat'-taulukosta käyttäen silmukan indeksiä.

Hanki vierekkäisen laatan x- ja y-arvot, ja sitten saamme etäisyyden 'tavoite laatta' ja 'vierekkäisen laatan' avulla käyttämällä tätä kaavaa:

etäisyys = sqrt((x2 - x1)^2+(y2 - y1)^2)
x1 = Tavoite x
x2 = Vierekkäinen x
y1 = Tavoite y
y2 = Vierekkäinen y

Ensinnäkin vähentämme heidän x- ja y-arvonsa, kerromme sen itsellään saamaan eksponentiaaliset arvot, lisäämme nuo arvot, ja sitten otamme neliöjuuren lisätyistä arvosta saadaksemme etäisyysarvon.

Photo_2019-07-29__6_46_04_PM.png

Jos 'Etäisyys' arvo on pienempi kuin 'Minimi etäisyys' laatikkoarvo, asetamme 'kohde laatan indeksin' sen silmukan nykypainatukseen, joka on haetun laatan indeksi 'Vierekkäiset laatat'-taulukossa. Asetamme myös 'Minimi etäisyys'-laatikkoarvon.'etäisyys'-arvoksi niin, että voimme verrata sitä seuraavaan laattaan silmukan aikana.

Silmukan loputtua olemme verranneet jokainen vierekkäinen laatta ja saaneet vierekkäisen laatan indeksin, joka on lähinnä 'kohdetta laattaa'.

Liikkuminen vierekkäiseen laattaan

Tässä oppaan viimeisessä paketissa siirrämme avataarimme lähimpään vierekkäiseen laattaan ja toistamme koko 'Löydä reitti'-paketin, jos emme ole vielä siirtyneet 'kohdelautalle'.

Photo_2019-07-30__1_23_31_PM.png

Ensimmäinen asia, joka tapahtuu, tarkistaa, että 'Vierekkäiset laatojen määrä' on suurempi kuin 0. Tämä varmistaa, että siirrymme vain, jos olemme saaneet ainakin luotettavan vierekkäisen laatan.

Ja sitten 'Hae lähin laatta' käyttäen 'Kohde laatan indeksi' arvoa edellisestä paketista saadaksesi 'Vierekkäiset laatat'-taulukon arvon.

Jotta saamme tarkan pisteen, johon avataarimme siirtyy, tarvitsemme tuon laatan x- ja y-arvot, ja myös 'aloita x' ja 'aloita y' attribuutin. Sitten lisäämme yhteyden lähimmästä laattasta x- ja y-arvoista 'aloita x'-arvoon. Ennen kuin siirrymme tuohon pisteeseen, asetamme avataarimme 'edellisen laatan' arvoksi nykyiselle 'on tile'-attribuuttimme. Voimme saada tämän 'on tile' arvon aikaisemmista pakkauksista. Sitten siirrämme avataarimme oliikin x- ja y-pisteille, kesto on 0.2.

Kun 'Siirry kohtaan' käyttäytyminen valmistuu, asetamme nyt avataarimme 'on tile' attribuutti 'Hae lähimmän laatan' taulukon arvoksi. Jos 'Hae lähimmän laatan' arvot eivät ole yhtä kuin 'kohde laatan', niin voimme suorittaa 'Löydä reitti' paketti, ja näin toistamme koko paketin uudelleen. 'Tavoite laatta' attribuutti on saatu aikaisemmasta paketista.

Lastenpainetta siniselle laatalle, ja avataarimme ilmestyminen taulukkoon, 'Löydä reitti '(paketti. tämä laukaisee avataarin liikkuvuutta laatoilta laatoille.

Yhteenveto

Tässä oppaassa olemme oppineet tekemään reitin löytämistoiminnan käyttäen taulukkoa, jota kutsumme 'Grid', tarjoten tietoa siitä, onko laatan kyseenalaisena tai ei. Voit laajentaa tätä ideaa käyttämällä objektin tunnuksia tiedon tallennukseen sen sijaan, että käytettäisiin vain numeerista lukua meidän 'Grid'-taulukkomme. Näin saamme luotettavampaa tietoa jota voimme käyttää reitin löytämisprosessissa. Esimerkiksi voimme saada objektin ID:n attribuutit tietääksemme, onko se elossa vai ei, ja sallitaanko askellukselle sen laatan päälle vai ei.

Tämä opas tarjoaa vain perustiedot reitin löytämisestä. Tämän toiminnan haittana on, että se ei luo lyhintä mahdollista reittiä kohteena olevalle laatalle, ja vain tarkistaa sen nykyiset vierekkäiset laatat. Tämä voi johtaa liikkuvuuden silmukkaan, joka ei johda minnekään.

Kuitenkin, tämä voidaan ratkaista laajentamalla reitin löytämisen algoritmian. Voimme tehdä tämän toistamalla kerättyjä vierekkäisiä laattoja löytää ovia laattoja kohdettamme kunnes löydämme kohteemme. Jokainen löydetty lähin vierekkäinen laatta lisätään listalle. Jotta voidaan estää loputon silmukka, lisää ehtona, että jos vierekkäinen laatta oli aiemmin tarkastettu, sitä ei lisätä listalle. Lisää myös maksimi raja tähtäimeen, jotta voidaan estää loputon silmukka, mikä johtuu kohteesta laatan ja se on liian kaukana löytää. Kun se hyvin löytää kohdelaitasi, voimme käynnistää tuota toimintaa ja aloittaa siirron laatoilta laatoille käyttämällä laatalista.