Rutenettbasert Stifinning | hyperPad Documentation

Loading...

Logo

I denne opplæringen vil vi lage en simulering for å finne vei basert på et todimensjonalt matrise grid. Dette vil gi oss grunnleggende ideer til å lage aktiviteter for å finne vei i spillene våre. Vi vil visualisere gridet ved å bruke tomme firkantobjekter som fliser og et rundt objekt som vår avatar som kan bevege seg i dette gridområdet med våre kommandoer.

Video_2019-07-30__2_32_01_PM.gif

I. Sett opp objektene

Vi vil bare bruke fire objekter i prosjektet vårt. Vår grønne avatar, en blå flis, en hvit blokkade, og gridetiketten for å sette opp og visualisere gridet vårt.

Photo_2019-07-29__1_50_10_PM.png

Avatar

Vår avatar er et tomt objekt som har x- og y-skala på 50%. Sett kollisjonen til å være rund slik at den ser ut som den på bildet nedenfor. Dette objektet vil ha tre forhåndsdefinerte attributter: på flis, forrige flis, og målflis. Sett standardverdiene for disse attributtene til null slik at de ikke får en nullverdi når vi prøver å hente dem senere.

Photo_2019-07-29__1_53_38_PM.png

Flisobjekt

Lag et annet tomt objekt som skal brukes til å visualisere flisene i gridet vårt. Skalaen er også 50% og har bare ett forhåndsdefinert attributt: på flis. Sett også denne verdien til null.

Photo_2019-07-29__1_53_51_PM.png

Blokkadeobjekt

Lag et annet tomt objekt som vil tjene som blokkader i gridet vårt. Dette er et hvitt tomt objekt med en skala på 40%. Vår avatar vil ikke kunne passere en flis som har en blokkade oppå seg.

Gridetikett

Dette er bare en etikett som vil ha oppførslene som lar oss sette opp og visualisere gridet vårt. Den har forhåndsdefinerte attributter: start x med en verdi på 4, og start y med en verdi på 3. Disse verdiene er forskyvninger som vil bli brukt som referanser når vi spawner flisene våre for å plassere gridet vårt pent i midten.

Photo_2019-07-29__1_56_01_PM.png

Avatar/Flis Forhåndsdefinerte attributter:

Vi definerer en flis her som et 2-størrelse matrise som vil ha en x- og y-verdi basert på gridet vårt.

  • på flis - dette er flisverdien som objektet vårt for øyeblikket befinner seg på i gridet vårt
  • forrige flis - en flis som tidligere ble krysset av vår avatar
  • målflis - flisen som avataren vår vil gå til

II. Sett opp gridet

Inne i gridetiketten er hvor vi vil definere vår 2D-matrise og spawne gridet vårt. Det er 2 hovedpunkter i dette objektet: sette opp matrisen, og visualisere matrisen. La oss først gjøre oppsettet for matrisepakken.

Photo_2019-07-29__3_05_10_PM.png

Sett opp matrisen - pakke

Først er å opprette en tom matrise kalt 'Grid'. Denne matrisen vil inneholde vår todimensjonale matrise. Vi vil ha en bokskontainer kalt 'x radteller' som har en verdi av 24 og en annen tom matrise kalt 'y rad' som har 18 tomme verdier.

Photo_2019-07-29__1_55_28_PM.png

Den første oppførselen i pakken vår er en løkke med gjentakelsestider av 'x radteller'. For hvert trinn i denne løkken vil vi legge til en tom y-rad til 'Grid-arrayet'. Dette vil opprette en matrise i en matrise med dimensjonene 24x18.

Merk at vi har koblet en inaktiv kommentar i starten av pakken vår for å negere den automatiske utførelsen av denne rotoppførselen. En rotoppførsel er en oppførsel som ikke utløses basert på noen hendelse og er plassert åpent i grensesnittet.

Visualiser gridet - pakke

Det viktigste vi vil gjøre her er å gå gjennom hver verdi av vårt 'Grid-array' og spawne et flisobjekt. Vi vil også legge til en betingelse i løkken vår som vil tillate spawing av en hvit blokkade oppå flisobjektet.

Photo_2019-07-29__3_56_37_PM.png

Først er å få telleren for matrisen vår 'y radmatrise', verdien til 'start x'-attributtet til dette objektet og 'start y'.

Lag en løkke som har en gjentakelse av 'x radteller' og for hvert trinn i denne løkken, vil vi legge til indeksverdien til denne løkken og verdien av at 'start x'-attributtet. Dette resulterer i en absolutt x-posisjon som vi vil bruke for å plassere flisene vi spawner seinere. Neste er 'y radløkka' som har en gjentakelse av 'y radteller'. For hvert trinn i denne løkken vil vi legge til indeksverdien til denne løkken og verdien av 'start y', som nå vil resultere i den absolutte y-posisjonen.

Photo_2019-07-29__4_03_51_PM.png

Etter å ha lagt til verdiene under 'y radløkka' er det å spawne det blå objektet. Sett # av levende objekter til 999 fordi vi vil ha mange av dem til gridet vårt, og også med en varighet på 0. Flytt så det spawne objektet til et x-punkt med en verdi fra x løkke 'legg til verdier', og y-punktet fra y-løkkens 'legg til verdier'.

Neste er å legge til et array med 2 tomme verdier kalt 'På flis' som vi bare vil bruke som en plassholder for matrise. Etter å ha flyttet flisobjektet er det å modifisere 'På flis'-matrisen ved å erstatte verdien på indeks 0 med verdien fra 'x radløkka'. Deretter legges det til en annen matrise-modifisering som erstatter verdien på indeks 1 med 'y radindeksen'. Dette er x- og y-koordinatene til gridet vårt som objektet vil ha som 'på flis'-attributt.

Nå setter vi attributtet til det spawne objektet med en dynamisk nøkkel, 'på flis', og med verdien av 'På flis - matrise'.

Photo_2019-07-29__4_41_55_PM.png

Fortsatt under y radløkka er betingelsen for å spawne den hvite blokkadeobjektet. Vi vil ha 2 av 5 sjanser for å utføre denne pakken som vil legge til randomiseringen av gridet vårt. Deretter vil vi flagge en verdi på 1 til x- og y-koordinaten til den i vår 'Grid'-matrise som forteller oss at den koordinaten har en spawnet blokkade.

Først er å ha et tilfeldig tall fra 1 til 5. Hvis tallet er mindre enn eller lik 2, vil vi spawne blokkaden. Sett antall levende objekter til 999 og flytt det objektet til samme punkt som den blå flisen som vi spawnete før, og også med en varighet på 0.

Neste er å lagre informasjonen om at denne koordinaten var okkupert av en blokkade, hvis den ble spawnet. Vi gjør dette ved å flagge den koordinaten med en verdi på 1. Først får vi verdien på indeks 'x radløkka' av 'Grid'-matrisen. Denne verdien gir oss en matrise av en 'y-rad'. Vi vil endre denne 'y-raden' ved å erstatte verdien på indeks 'y radløkka' med verdien 1, som er den flaggede verdien. Fordi denne verdimodifiseringen bare gjelder for den verdien, og ikke for 'Grid' selv, må vi fortsatt modifisere 'Grid'-matrisen. Erstatt verdien på indeks 'x radløkka' av 'Grid'-matrisen med verdien 'modifiser y rad - matrise'.

Når det spilles, burde det resultere i en slik form.

Photo_2019-07-29__4_45_18_PM.png

III. På flistrykk

For å kunne samhandle med gridet selv, må vi ha en pakkebehov når vi trykker på en blå flis. Den første trykkingen vil resultere i at avataren vår vises i gridet vårt, og enhver påfølgende trykk etter den hendelsen vil starte dens veifinning.

Inne i det blå objektet er en oppførselspakke som har 3 hovedpunkter: reset den forrige flisen til avataren vår, sett dens på flis/sett dens målflis, deretter sett en fargeanimasjon for å visualisere trykkbegivenheten på skjermen.

Photo_2019-07-29__5_00_44_PM.png

Først får vi 'på flis'-attributtet til flisobjektet. Sett 'forrige flis'-attributtet til avataren vår til 0. Avataren vår vil settes til å unngå å gå tilbake til en 'forrige flis', derfor resetter vi 'forrige flis' ved hvert flistrykk.

Neste er å hente 'på flis'-attributtet til avataren vår. Den første if-betingelsen er om 'på flis'-verdien er lik null. Dette betyr at hvis avataren fortsatt ikke har vist seg, så vil dette gi sann. Hvis det er sant, setter vi dens 'på flis'-attributt med verdien av flisobjektets 'på flis'-attributt. Deretter flytter vi posisjonen til avataren vår ved å hente posisjonen til flisobjektet, og peker x- og y-verdiene til det punktet med en varighet på 0.

Hvis 'på flis'-verdien ikke er lik null, setter vi 'målflis'-attributtet til avataren vår med flisobjektets 'på flis'-attributt. Dette betyr at avataren vår allerede er i gridet vårt, og så kan vi utføre oppførselspakken, 'finn vei'. Denne oppførselspakken har vi fortsatt ikke, men vi vil fikse dette igjen etter å ha gjort den senere delen av denne opplæringen for 'finn vei'-pakken.

Nå som vi har satt opp avataren vår riktig til gridet vårt, trenger vi bare å visualisere denne trykkbegivenheten. Først må vi ha en rotoppførsel 'få farge' for å hente sin opprinnelige farge. Så etter trykkbegivenheten, setter vi fargen til flisobjektet til svart med en varighet på 0, deretter setter vi fargen tilbake til den opprinnelige verdien med en varighet på 0.2.

Trykking på en blå flis skal resultere i dette.

Photo_2019-07-30__1_04_42_PM.png

IV. Utfør Finn Veipakken

For denne siste delen av opplæringen vår, vil vi gjøre algoritmen som lar oss finne den nærmeste flisen som avataren vår kan ta for å nå målet sitt. Denne pakken vil bli utført gjentatte ganger for hvert flistrekk som avataren vår beveger seg på gridet vårt.

Vi vil sette opp algoritmen inne i avatarobjektet vårt og den vil ha tre hovedpunkter: finne de tilstøtende flisene, finne den nærmeste tilstøtende flisen, og bevegelsen til den tilstøtende flisen.

Photo_2019-07-29__5_39_25_PM.png

Finne de tilstøtende flisene

I denne delen vil vi samle alle de tilstøtende flisene som avataren vår vil være i stand til å ferdes sikker gjennom. Vi vil sjekke dens fire retningstilgrensede fliser og se om de flisene har blokkader oppå dem eller om de tidligere har blitt tråkket på.

Photo_2019-07-29__5_40_24_PM.png

Først legger vi til vårt 'Tilgrensende fliser'-array. Et 'Retning'-array med 2 tomme verdier, og de fire retningene som har 2 verdier for hver av dem: N (0,1), S (0,-1), E (1,0), W( -1,0).

Den første oppførselen i pakken vår er å tømme våre tilstøtende fliser. Fordi vi vil gjenta denne pakken flere ganger, må vi ha våre innsamlede 'tilstøtende fliser' tilbakestilt hver gang. De neste fire oppførslene er modifikasjoner til 'Retning'-arrayet. Vi setter arrayet til 'Retning'-arrayet fire ganger med de fire retningene, og deretter utfører vi pakken nedenfor. Vi gjør dette for å lage en løkke med forskjellige verdier av 'Retning'-arrayet hver gang.

Photo_2019-07-29__6_04_42_PM.png

Nå som vi har retningene, må vi bare kombinere x- og y-verdiene med 'på flis'-attributtet til avataren vår. Så vil vi kunne få målet i 'Grid'-matrisen for å vite om den flisen var flagget med en blokkade.

'Retning x' er verdien av 'Retning'-arrayet på indeks 0, 'hent på flis' x er verdien av 'hent på flis' på indeks 0. Mål x er verdiene som legges til av 'retning x' og 'hent på flis x'. Det samme gjelder y-verdiene, men med et målindeks på 1.

'Mål y rad' er arrayverdien av 'Grid'-matrisen på indeks 'Mål x'. Og så vil 'Målindeks i y-raden' være verdien av 'Mål y rad'-arrayet på indeksen 'Mål y'. Det er koordinaten i gridet vårt som vil kunne fortelle oss om den var flagget med en blokkade.

Photo_2019-07-29__6_17_41_PM.png

Hvis verdien i 'Målindeks i y-raden' er 1, så var den målflisen flagget som blokkert. Men hvis verdien ikke er lik 1, kan vi fortsette i pakken vår.

Fordi vår Mål x og y besto betingelsene, har vi lagt til en ny tom flisarray kalt 'Ny tilstøtende flis'. Denne vil lagre verdiene til Mål x og y som en flisarray. Vi vil sette verdien til Mål x til indeks 0 av 'Ny tilstøtende flis' og Mål y til indeks 1.

Nå henter vi 'forrige flis'-attributtet til avataren vår. Hvis 'forrige flis' ikke er lik 'ny tilstøtende flis', vil det bety at den nye flisen ikke har blitt krysset tidligere. Da kan vi trygt legge til 'Ny tilstøtende flis' til 'Tilstøtende fliser'-arrayet ved å legge den til.

"Du kan utvide denne pakken ved å lage 8 retning Arrays som lar avataren din bevege seg i diagonale retninger."

Finne den nærmeste tilstøtende flisen

Nå som vi har samlet våre pålitelige tilstøtende fliser, må vi bare få den tilstøtende flisen som er nærmest til målflisen til avataren vår. Vi vil beregne dette ved å bruke en avstandsformel basert på x- og y-verdiene til målet vårt og de tilstøtende flisene.

Det er to hovedpunkter i denne pakken: initialisering av variabler for beregning, og beregning av flisavstander inne i en løkke.

a. Initialisering av variabler

Først er å hente telleren for våre tilstøtende fliser. Deretter henter vi 'målflis'-attributtet til avataren vår og henter dens x- og y-verdier. Vi legger til 2 nye bokskontainere: 'Min avstand' og 'Målflisindeks'. Vi setter den første verdien av 'Min avstand' til 9999, og verdien av 'Målflisindeks' til 0. Min avstand er satt til et høyt tall fordi vi trenger den minste avstanden fra starten. Målflisindeks er vår referanseindeks i 'Tilstøtende fliser'-arrayet som har den minste avstanden til vår 'målflis'.

Vårt hovedmål her er å få indeksen til flisen inne i vår 'Tilstøtende fliser'-array som er nærmest til vår 'målflis'.

Photo_2019-07-29__6_47_43_PM.png

b. Beregning av flisavstander

I denne pakken vil vi gjøre beregningene inne i en løkke som skal gjøres for hver tilstøtende flis. Løkken gjentar seg etter 'tilstøtende fliser teller' og vi vil hente flisverdien fra 'Tilstøtende fliser'-arrayet ved å bruke indeksen fra den løkken.

Få x- og y-verdiene av den tilstøtende flisen, og deretter får vi avstanden mellom vår 'målflis' og 'tilstøtende flis' ved å bruke denne formelen:

avstand = sqrt((x2 - x1)^2+(y2 - y1)^2)
x1 = Mål x
x2 = Tilstøtende x
y1 = Mål y
y2 = Tilstøtende y

Først trekker vi x- og y-verdiene fra hverandre, multipliserer med seg selv for å få eksponentielle verdier, legger til disse verdiene og deretter tar kvadratroten av de addere verdiene for å få avstandsverdien.

Photo_2019-07-29__6_46_04_PM.png

Hvis 'Avstand'-verdien er mindre enn verdien til 'Min avstand'-bokskontainerverdien, setter vi da 'målflisindeks'-verdien til den gjeldende indeksen fra løkken, som er indeksen til vår hentede flis inne i 'Tilstøtende fliser'-arrayet. Vi setter også verdien til 'Min avstand'-bokskontaineren til 'Avstand'-verdien for at vi skal sammenligne den med den neste flisen i løkken vår.

Etter enden av løkken har vi sammenlignet hver eneste en av våre tilstøtende fliser, og vi har fått indeksverdien til den tilstøtende flisen som er nærmest 'målflisen'.

Bevegelse til den tilstøtende flisen

I denne siste pakken i opplæringen vil vi flytte avataren vår til den nærmeste tilstøtende flisen og gjøre hele 'Finn vei'-pakken på nytt hvis vi ikke allerede har flyttet til vår 'målflis'.

Photo_2019-07-30__1_23_31_PM.png

Det første vi gjør er å sjekke om vår 'Tilstøtende fliser teller' er større enn 0. Dette er for å sikre at vi bare vil bevege oss om vi har hentet minst én pålitelig tilstøtende flis.

Så 'Hent den nærmeste flisen' ved å bruke 'Målflisindeks'-verdien fra den forrige pakken for å få arrayverdien fra 'Tilstøtende fliser'-arrayet.

For å få det eksakte punktet der avataren vår skal flytte til, trenger vi x- og y-flisverdiene fra den flisen, og også hente 'start x' og 'start y'-attributtverdiene fra gridetiketten vår. Vi legger deretter sammen x-verdien fra vår 'nærmeste flis' og 'start x'-verdien, og også det samme med y-verdiene. Disse addere verdiene er våre mål x- og y-punkter der avataren vår skal bevege seg til.

Før vi flytter til det punktet, setter vi 'forrige flis'-attributtet til avataren vår til dens nåværende 'på flis'-attributtverdi. Vi kan hente denne 'på flis'-verdien fra de tidligere pakkene. Vi flytter deretter avataren vår til våre målpunkter, med en varighet på 0.2.

Etter at 'Beveg til punkt'-oppførselen er fullført, setter vi nå 'på flis'-attributtverdien til avataren vår med verdien fra 'Hent nærmeste flis'-arrayet. Hvis verdien av 'Hent nærmeste flis'-arrayet ikke er lik vår 'målflis', vil vi deretter utføre 'Finn vei'-pakken, og dermed gjøre hele pakken igjen. 'Målflis'-attributtverdien kan hentes fra den forrige pakken.

Ved å trykke på en hvilken som helst blå flis, og etter at avataren vår vises i gridet, vil 'Finn vei'-pakken bli utført. Dette vil utløse bevegelsen til avataren fra flis til flis.

Konklusjon

I denne opplæringen har vi lært å lage en aktivitet for å finne vei med et objekt ved hjelp av en matrise som vi kalte 'Grid', som brukes til å lagre informasjon om hvorvidt flisen var okkupert eller ikke. Du kan utvide denne ideen ved å bruke objektids som informasjonslagring i stedet for bare et tall for vår 'Grid'-matrise. Dette vil gi oss mer pålitelig informasjon som vi kan bruke når vi gjør veifinning. For eksempel kan vi hente attributtene til den objektidentifikatoren for å vite om det er i live eller ikke, om det vil tillate oss å tråkke på flisen eller ikke.

Denne opplæringen fôret kun det grunnleggende om veifinning. En ulempe ved dette er at den ikke lager den korteste veien mulig til en målflis, og bare sjekker de nåværende tilstøtende flisene. Dette kan resultere i en bevegelsessløyfe som ikke fører noe sted.

Men dette kan løses ved å utvide veifinningsalgoritmen vår. Vi kan gjøre dette ved å gjenta våre hentede tilstøtende fliser for å få deres tilstøtende fliser også til vi finner vår målflis. Hver funnet nærmeste tilstøtende flis vil bli lagt til en liste. For å hindre en uendelig sløyfe, legg til en betingelse som sier at hvis den tilstøtende flisen allerede var sjekket, vil ikke den flisen bli lagt til listen vår. Legg også til en maksimalt grense på antall iterasjoner for å forhindre en uendelig sløyfe som forårsakes av målflisen hvis den er for langt unna eller ikke mulig å bli funnet. Når den iterasjonen finner målflisen, avslutter vi den iterasjonen og begynner å bevege avataren fra flis til flis ved å bruke fliselisten.