Pronalaženje puta na mreži | hyperPad Documentation

Loading...

Logo

U ovom priručniku ćemo napraviti simulaciju pronalaženja puta baziranu na dvodimenzionalnoj mreži niza. Ovo će nam dati osnovnu ideju o stvaranju aktivnosti pronalaženja puta u našim igrama. Vizualizirat ćemo mrežu koristeći prazne kvadratne objekte kao pločice i okrugli objekt kao našu avatara koja se može kretati po tom području mreže na našu komandu.

Video_2019-07-30__2_32_01_PM.gif

I. Postavljanje objekata

U našem projektu ćemo koristiti samo četiri objekta. Naša zelena avata, plava pločica, bijela blokada i oznaka mreže za postavljanje i vizualizaciju naše mreže.

Photo_2019-07-29__1_50_10_PM.png

Avata

Naša avata je prazan objekt koji ima x i y razmjere od 50%. Postavite njegovu koliziju na okrugli oblik tako da izgleda poput one na slici ispod. Ovaj objekt će imati tri unaprijed definirana atributa: na pločici, prethodna pločica i ciljana pločica. Postavite zadane vrijednosti ovih atributa na nulu kako ne bi imale null vrijednost kada ih pokušamo dohvatiti kasnije.

Photo_2019-07-29__1_53_38_PM.png

Pločica objekat

Stvorite još jedan prazan objekt koji će se koristiti za vizualizaciju pločica u našoj mreži. Njegova razmjera također iznosi 50% i ima samo jedan unaprijed definiran atribut: na pločici. Također postavite ovu vrijednost na nulu.

Photo_2019-07-29__1_53_51_PM.png

Objekt blokade

Stvorite još jedan prazan objekt koji će poslužiti kao blokade u našoj mreži. Ovo je bijeli prazan objekt s razmjernom vrijednošću od 40%. Naša avata neće moći proći na pločicu koja ima blokadu iznad nje.

Oznaka mreže

Ovo je samo oznaka koja će imati ponašanja koja će omogućiti postavljanje i vizualizaciju naše mreže. Ima unaprijed definirane atribute: početni x s vrijednošću 4, i početni y s vrijednošću 3. Ove vrijednosti su pomaci koji će se koristiti kao referenca prilikom generiranja naših pločica kako bismo uredno pozicionirali našu mrežu u središte.

Photo_2019-07-29__1_56_01_PM.png

Avata/Pločica unaprijed definirani atributi:

Definiramo pločicu ovdje kao dvodimenzionalni niz koji će imati x i y vrijednost na temelju naše mreže.

  • na pločici - ovo je vrijednost pločice na kojoj se naš objekt trenutno nalazi u našoj mreži
  • prethodna pločica - pločica koju je prethodno prešao naš avata
  • ciljana pločica - pločica na koju će naš avata ići

II. Postavljanje mreže

Unutar oznake mreže definirat ćemo naš dvodimenzionalni niz i postavljanje naše mreže. Postoje 2 glavne ključne točke u ovom objektu: postavljanje niza i vizualizacija niza. Prvo ćemo uraditi paket postavljanja niza.

Photo_2019-07-29__3_05_10_PM.png

Postavi niz - paket

Prvo je stvoriti prazan niz nazvan 'Mreža'. Ovaj niz će sadržavati naš dvodimenzionalni niz. Imaćemo kutiju s nazivom 'x broj redova' koja ima vrijednost 24 i još jedan prazan niz nazvan 'y red' koji ima 18 praznih vrijednosti.

Photo_2019-07-29__1_55_28_PM.png

Prvo ponašanje u našem paketu je petlja s brojem ponavljanja 'x broj redova'. Za svaki korak ove petlje, dodajemo prazan y red u 'Mreža niz'. Ovo će stvoriti niz unutar niza s dimenzijama 24x18.

Primijetite da smo povezali neaktivan komentar na početku našeg paketa kako bismo negirali automatsko izvršavanje ovog korijenskog ponašanja. Korijensko ponašanje je ponašanje koje se ne pokreće na temelju bilo kojeg događaja i postavlja se slobodno u sučelju.

Vizualiziraj mrežu - paket

Glavna stvar koju ćemo učiniti ovdje je traversirati svaku vrijednost našeg 'Mreža niza' i generirati objekt pločice. Također ćemo dodati uvjet u našoj petlji koji će omogućiti generiranje bijele blokade iznad objekta pločice.

Photo_2019-07-29__3_56_37_PM.png

Prvo je dobiti broj elemenata našeg 'y red niza', vrijednost atributa 'početni x' ovog objekta i 'početni y'.

Stvorite petlju koja ima ponavljanje 'x broj redova' i za svaki korak ove petlje, dodajemo indeks tu vrijednost te vrijednost 'početni x'. Ovo rezultira apsolutnom x pozicijom koju ćemo koristiti za pozicioniranje naših generiranih pločica kasnije. Zatim dolazi 'y red petlja' koja ima ponavljanje 'y broj redova'. Za svaki korak ove petlje, dodajemo indeks tu vrijednost i 'početni y' atribut; što će sada rezultirati apsolutnom y pozicijom.

Photo_2019-07-29__4_03_51_PM.png

Nakon dodavanja vrijednosti unutar 'y red petlje', trebamo generirati plavi objekt. Postavite #živih objekata na 999 jer će nam trebati mnogo njih za našu mrežu, a također s trajanjem 0. Zatim pomičemo taj generirani objekt na x točki s vrijednošću iz x petlje 'dodaj vrijednosti', i na y točki s vrijednošću iz y petlje 'dodaj vrijednosti'.

Nakon toga dodajemo niz s 2 prazne vrijednosti nazvane 'Na pločici' koje ćemo koristiti samo kao pokazivač niza. Nakon premještanja objekta pločice potrebno je modificirati niz 'Na pločici' zamjenom njegove vrijednosti na indeksu 0 s vrijednosti 'x red petlje'. Zatim dodajte drugu modifikaciju niza koja zamjenjuje vrijednost na indeksu 1 s 'y red indeks'. Ovo su x i y koordinate naše mreže koje će objekt imati kao atribut 'na pločici'.

Sada postavite atribut generiranog objekta s dinamičkim ključem, 'na pločici', i s vrijednošću 'Na pločici - niz'.

Photo_2019-07-29__4_41_55_PM.png

Još uvijek, pod y red petljom, je uvjet za generiranje bijelog objekta blokade. Imat ćemo 2 od 5 šanse za izvršenje ovog paketa, što će dodati randomizaciju u našu mrežu. Tada ćemo označiti vrijednost 1 za x i y koordinate našeg 'Mreža' niza što nam govori da je ta koordinata imala generiranu blokadu.

Prvo je dobiti slučajan broj od 1 do 5. Ako je taj broj manji ili jednak 2, generirat ćemo blokadu. Postavite njene #živih objekata na 999 i premjestite taj objekt na istu točku gdje je generirana plava pločica, također s trajanjem 0.

Zatim trebamo pohraniti informacije da je ta koordinata bila zauzeta blokadom, ako je bila generirana. To činimo označavajući tu koordinatu s vrijednošću 1. Prvo dobivamo vrijednost na indeksu 'x red petlje' iz 'Mreža' niza. Ova vrijednost će nam dati niz 'y red'. Modificiramo ovaj 'y red' zamjenom njegove vrijednosti na indeksu 'y red petlje' s vrijednošću 1, koja je označena vrijednost. Budući da se ova modifikacija vrijednosti primjenjuje samo na tu vrijednost, a ne na 'Mrežu sama', još uvijek moramo modificirati 'Mreža' niz. Zamijenite vrijednost na indeksu 'x red petlje' 'Mreža' niza s vrijednošću 'modificirani y red - niz'.

Kada se odigra, trebao bi rezultirati ovom vrstom oblika.

Photo_2019-07-29__4_45_18_PM.png

III. Osvježavanje na pločici

Kako bismo mogli komunicirati s mrežom, trebat ćemo paket ponašanja kad god pritisnemo plavu pločicu. Prvo pritiskanje rezultirat će pojavom naše avata u našoj mreži, a svaki uzastopni pritisak nakon tog događaja pokrenut će pronalaženje puta.

Unutar plavog objekta nalazi se paket ponašanja koji se sastoji od 3 glavne točke: resetiranje prethodne pločice naše avate, postavljanje njene na pločici/postavljanje njezine ciljne pločice, a zatim postavljanje animacije boje kako bi se vizualizirala dodirna akcija na ekranu.

Photo_2019-07-29__5_00_44_PM.png

Prvo dobivamo atribut 'na pločici' objekta pločice. Postavite atribut 'prethodna pločica' naše avate na 0. Naša avata će biti postavljena na izbjegavanje povratka na 'prethodnu pločicu', zato resetiramo 'prethodnu pločicu' na svako pritiskanje pločice.

Sljedeće je dobiti atribut 'na pločici' naše avate. Prvi uvjet ako je 'na pločici' vrijednost jednaka nuli. To znači da ako avata još nije pojavljena, tada će ovo rezultirati istinom. Ako je istina, postavit ćemo njen atribut 'na pločici' s vrijednošću atributa 'na pločici' objekta pločice. Zatim ćemo premjestiti položaj naše avate dobivajući poziciju objekta pločice, usmjeravajući njegove x i y vrijednosti na tu točku s trajanjem 0.

Ako 'na pločici' vrijednost nije jednaka nuli, postavit ćemo atribut 'ciljana pločica' naše avate s vrijednošću atributa 'na pločici' objekta. To znači da je naša avata već u našoj mreži, a tada možemo izvršiti paket ponašanja 'pronađi put'. Još uvijek nemamo ovo ponašanje, ali ćemo to popraviti nakon što završimo kasniji dio ovog priručnika za paket 'pronađi put'.

Sada kada smo ispravno postavili našu avatu u našu mrežu, samo trebamo vizualizirati ovaj događaj pritiska. Prvo imamo korijensko ponašanje 'dohvati boju' kako bismo dobili njenu izvornu boju. Zatim nakon pritiska, postavljamo boju objekta pločice na crnu s trajanjem 0, a zatim vraćamo njenu boju natrag na njenu izvornu vrijednost s trajanjem 0.2.

Pritiskanje na plavu pločicu treba rezultirati ovim.

Photo_2019-07-30__1_04_42_PM.png

IV. Izvrši paket pronađi put

Za ovaj posljednji dio našeg priručnika, učinit ćemo algoritam koji nam omogućuje da pronađemo najbližu pločicu koju naša avata može uzeti kako bi došla do odredišta. Ovaj paket će se izvršavati neprekidno za svaki korak pločice na kojem se naša avata kreće po našoj mreži.

Postavit ćemo algoritam unutar našeg objekta avate koji će imati tri glavne točke: pronalaženje susjednih pločica, pronalaženje najbliže susjedne pločice, i kretanje prema toj susjednoj pločici.

Photo_2019-07-29__5_39_25_PM.png

Pronalaženje susjednih pločica

U ovom dijelu ćemo prikupiti sve susjedne pločice koje bi naša avata mogla preći. Provjerit ćemo njezine četiri smjerne susjedne pločice i vidjeti imaju li te pločice blokadu iznad sebe ili su prethodno stajane na njima.

Photo_2019-07-29__5_40_24_PM.png

Prvo dodajte naš niz 'Susjedne pločice'. Niz 'Smjer' s 2 prazne vrijednosti i četiri smjerne pločice koje imaju 2 vrijednosti za svaku: S (0,1), J (0,-1), I (1,0), Z ( -1,0).

Prvo ponašanje u našem paketu je čišćenje susjednih pločica. Budući da ćemo ovo ponašanje izvoditi neprekidno, trebamo svaki put resetirati prikupljene 'susjedne pločice'. Sljedeća četiri ponašanja su modifikacije niza 'Smjer'. Postavljamo niz na 'Smjer' četiri puta s četiri smjerne pločice, a zatim izvršavamo paket ispod. To činimo kako bismo stvorili petlju s različitim 'Smjer' nizovim vrijednostima svaki put.

Photo_2019-07-29__6_04_42_PM.png

Sada kada imamo smjer, samo trebamo kombinirati njihove x i y vrijednosti s atributom 'na pločici' naše avate. Tada ćemo moći dobiti našu ciljnu vrijednost u 'Mreža' nizu kako bismo znali je li ta pločica označena s blokadom.

'Smjer x' je vrijednost niza 'Smjer' na indeksu 0, 'dohvati na pločici' x je vrijednost 'dohvati na pločici' na indeksu 0. Ciljani x je zbroj vrijednosti 'smjer x' i 'dohvati na pločici x'. Isto poput y vrijednosti, ali s ciljanom indeksu od 1.

'Ciljani y red' je niz vrijednosti 'Mreža' na indeksu 'Ciljani x'. I tada će 'Ciljani indeks u y redu' biti vrijednost niza 'Ciljani y red' na indeksu 'Ciljani y'. To su koordinate u našoj mreži koje će nam moći reći je li označeno s blokadom.

Photo_2019-07-29__6_17_41_PM.png

Ako je vrijednost u 'Ciljani indeks u y redu' 1, tada je ta ciljana pločica označena kao blokirana. Ako vrijednost nije jednaka 1, možemo nastaviti s našim paketom.

Budući da je naš Ciljani x i y prošao naš uvjet, dodali smo novi prazni niz pločica nazvan 'Nova susjedna pločica'. Ovo će pohraniti vrijednosti Ciljani x i y kao niz pločica. Postavit ćemo vrijednost Ciljani x na indeks 0 'Nova susjedna pločica' i Ciljani y na indeks 1.

Sada dobijemo atribut 'prethodna pločica' naše avate. Ako 'prethodna pločica' nije jednaka 'novoj susjednoj pločici', to bi značilo da nova pločica prethodno nije pređena. Tada, možemo sigurno dodati 'Novu susjednu pločicu' u niz 'Susjedne pločice' dodavanjem.

"Možete proširiti ovaj paket stvaranjem 8 smjernih nizova što omogućava vašoj avati kretanje dijagonalnim smjerovima."

Pronalaženje najbliže susjedne pločice

Sada kada smo prikupili naše pouzdane susjedne pločice, samo trebamo dobiti susjednu pločicu koja je najbliža ciljnim pločici naše avate. Učinit ćemo izračunavanje koristeći formulu udaljenosti na temelju x i y vrijednosti naše ciljne pločice i susjednih pločica.

Postoje dvije ključne točke u ovom paketu: inicijalizacija varijabli za izračunavanje i izračunavanje udaljenosti pločica unutar petlje.

a. Inicijalizacija varijabli

Prvo je dobiti broj elemenata našim susjednim pločicama. Potom dobivamo atribut 'ciljna pločica' naše avate i dobivamo njene x i y vrijednosti. Dodajemo 2 nove kutije: 'Min udaljenost' i 'Index ciljne pločice'. Postavimo inicijalnu vrijednost 'Min udaljenost' na 9999, a vrijednost 'Index ciljne pločice' na 0. Minimalna udaljenost je postavljena na visoku vrijednost jer trebamo najmanju udaljenost od početka. Indeks ciljne pločice je naš referentni indeks u nizu 'Susjedne pločice' koji ima najmanju udaljenost do naše 'ciljne pločice'.

Naš glavni cilj ovdje je dobiti indeks pločice unutar našeg niza 'Susjedne pločice' koja je najbliža našoj 'ciljnoj pločici'.

Photo_2019-07-29__6_47_43_PM.png

b. Izračunavanje udaljenosti pločica

U ovom paketu, ćemo izvršiti izračunavanje unutar petlje koju ćemo izvršiti za svaku susjednu pločicu. Petlja se ponavlja prema 'broj susjednih pločica' i dobivamo vrijednost pločice iz niza 'Susjedne pločice' koristeći indeks te petlje.

Dobijemo x i y vrijednosti te susjedne pločice i tada ćemo dobiti udaljenost između naše 'ciljne pločice' i 'susjedne pločice' koristeći ovu formulu:

udaljenost = sqrt((x2 - x1)^2+(y2 - y1)^2)
x1 = Ciljani x
x2 = Susjedni x
y1 = Ciljani y
y2 = Susjedni y

Prvo oduzmemo njihove x i y vrijednosti, množimo ih sa samima sobom kako bismo dobili njihove eksponencijalne vrijednosti, dodamo te vrijednosti, a zatim izračunamo kvadratni korijen dodaćih vrijednosti kako bismo dobili vrijednost udaljenosti.

Photo_2019-07-29__6_46_04_PM.png

Ako je 'Udaljenost' vrijednost manja od vrijednosti kutije 'Min udaljenost', tada ćemo postaviti vrijednost 'indeks ciljne pločice' na trenutni indeks petlje, što je indeks naše preuzete pločice unutar 'Susjedne pločice' niza. Također postavljamo vrijednost kutije 'Min udaljenost' s vrijednošću 'Udaljenost' kako bismo je usporedili s sljedećom pločicom u petlji.

Nakon završetka petlje, usporedili smo svaku od naših susjednih pločica i dobili smo indeks vrijednosti susjedne pločice koja je najbliža našoj 'ciljnoj pločici'.

Kretanje prema susjednoj pločici

U ovom posljednjem paketu našeg priručnika, premjestit ćemo našu avatu na najbližu susjednu pločicu i ponoviti cijeli paket 'Pronalaženje puta' ako se još nismo pomaknuli na našu 'ciljnu pločicu'.

Photo_2019-07-30__1_23_31_PM.png

Prvo je provjeriti da li je naš 'broj susjednih pločica' veći od 0. Ovo osigurava da ćemo se kretati samo ako smo dobili barem jednu pouzdanu susjednu pločicu.

Zatim 'Dobijamo najbližu pločicu' koristeći naš 'index ciljne pločice' vrijednost iz prethodnog paketa kako bismo dobili vrijednost niza 'Susjedne pločice'.

Kako bismo dobili točnu točku na koju će se naša avata kretati, trebamo x i y pločice vrijednosti te pločice, i također dobiti 'početni x' i 'početni y' atribut vrijednosti naše oznake 'Mreža'. Zatim dodajemo x vrijednost naše 'najbliže pločice' i 'početni x' vrijednost, a također isto s y vrijednostima. Ove dodane vrijednosti su naše ciljne x i y točke prema kojima će se naša avata kretati.

Pre nego što se pomaknemo prema toj točki, postavljamo 'prethodnu pločicu' naše avate na trenutnu vrijednost njezina atributa 'na pločici'. Ovu 'na pločici' vrijednost možemo dobiti iz prethodnih paketa. Premještamo našu avatu na naše ciljne točke, s vremenom od 0.2.

Nakon završetka ponašanja 'Pomakni se na točku', sada postavljamo vrijednost atributa 'na pločici' naše avate na vrijednost niza 'Dobij najbližu pločicu'. Ako vrijednost niza 'Dobij najbližu pločicu' nije jednaka našoj 'ciljnoj pločici', tada ćemo izvršiti paket 'Pronađi put', ponovo izvršivši cijeli paket. Vrijednost atributa 'ciljna pločica' može se dobiti iz prethodnog paketa.

Pritiskom na bilo koju plavu pločicu, a nakon pojavljivanja naše avate na mreži, izvršit će se paket 'Pronađi put'. Ovo će pokrenuti kretanje avate od pločice do pločice.

Zaključak

U ovom priručniku naučili smo kako napraviti aktivnost pronalaženja puta za objekt koristeći niz koji smo nazvali 'Mreža', koji se koristi za pohranu informacijâ o tome je li ta pločica zauzeta ili ne. Možete proširiti ovu ideju, koristeći identifikatore objekata kao informacije za pohranu umjesto samo brojčane vrijednosti za naš 'Mreža' niz. To će nam dati pouzdanije informacije koje možemo koristiti kada radimo pronalaženje puta. Na primjer, možemo dobiti atribute tog identifikatora objekta kako bismo znali je li živ ili ne, da li će nam dopustiti da stanemo na njegovoj pločici ili ne.

Ovaj priručnik samo je poslužilo kao osnovna ideja iza pronalaženja puta. Jedan nedostatak od ovoga je da ne stvara najkraći put moguć, a samo provjerava trenutne susjedne pločice. Ovo može rezultirati petljom kretanja koja ne dolazi nikuda.

Međutim, ovo se može riješiti proširivanjem našeg algoritma pronalaženja puta. To možemo učiniti ponavljanjem na našim preuzetim susjednim pločicama kako bismo dobili njihove susjedne pločice dok ne pronađemo našu cilju pločicu. Svaka pronađena najbliža susjedna pločica bit će dodana na popis. Kako bismo spriječili beskonačnu petlju, dodati uvjet da, ako je ta susjedna pločica već provjeravana, ta pločica neće biti dodana na naš popis. Također, dodajte maksimalnu granicu na broj ponavljanja kako biste spriječili beskonačnu petlju uzrokovanu ciljanom pločicom ako je previše daleko ili nije moguće pronaći. Kada ta iteracija pronađe ciljani pločicu, tada napuštamo tu iteraciju i počinjemo premještati avatu od pločice do pločice koristeći popis pločica.