Forstå styringsadferd vandre

Styringsadferdene tar sikte på å hjelpe autonome tegn å bevege seg på en realistisk måte, ved å bruke enkle krefter som kombinerer å produsere livslignende improvisasjonsnavigering. I denne opplæringen vil jeg dekke vandre oppførsel, som gjør tegnet flytte tilfeldig.

Merk: Selv om denne opplæringen er skrevet med AS3 og Flash, bør du kunne bruke de samme teknikkene og konseptene i nesten hvilket som helst spillutviklingsmiljø. Du må ha en grunnleggende forståelse av matematiske vektorer.


Vandre rundt

Ofte skal tegnene til et spill tilfeldig bevege seg rundt sitt miljø. Vanligvis venter de personene bare på at noe skal skje (som en kamp mot spilleren) eller de leter etter noe. Når spilleren er i stand til å se atferden, må karakterens vandrende evne være visuelt hyggelig og realistisk nok.

Hvis spilleren er i stand til å identifisere sterkt definerte banelinjer eller urealistisk bevegelsesadferd, vil det generere frustrasjon. I verste fall vil spilleren finne ut hvordan man kan forvente tegnets bevegelser, noe som resulterer i en kjedelig spillopplevelse.

De vandre styringsadferd har som mål å produsere en realistisk "uformell" bevegelse, noe som gjør at spilleren tror at tegnet virkelig lever og går rundt.


Søk og tilfeldighet

Det er flere måter å implementere vandringsmønsteret ved hjelp av styringsadferd. Den enkleste bruker den tidligere beskrevne søkeadferd. Når et tegn utfører søk, vil det bevege seg mot et mål.

Hvis posisjonen til det målet endres hvert par sekunder, vil tegnet aldri kunne nå målet (og selv om det gjøres, vil målet bevege seg igjen). Plasser målet tilfeldig i spillområdet vil få karakteren til slutt å bevege seg rundt hele miljøet jager målet. Demoen nedenfor viser denne tilnærmingen i aksjon:


Søkeoppførelsen og et tilfeldig mål. Klikk på demoen for å vise kraftvektorer.

Koden for denne gjennomføringen vil være:

 // Beregn vandrestyrken privat funksjon vandre (): Vector3D var nå: Nummer = (ny dato ()). GetTime (); hvis (nå> = nextDecision) // Velg en tilfeldig posisjon for "target" // returnere en styringskraft som skyver tegnet // mot målet (søkeadferansen) returforsøk (mål);  // i spillsløyfen, håndter styrker og bevegelser bare // som før: offentlig funksjonoppdatering (): void styring = sving () styring = avkorting (styring, maks_force) styring = styring / massehastighet = trunkering (hastighet + styring, max_speed) posisjon = posisjon + hastighet

Selv om dette er en enkel og god tilnærming, er det endelige resultatet ikke så overbevisende. Noen ganger tegner karakteren sin rute fordi målet er plassert bak det. Karakterens oppførsel virker mye mer som "Damn, jeg har glemt mine nøkler!" enn "Ok, jeg vil følge denne retningen nå".


Wander

En annen implementering av vandringsoppførelsen ble foreslått av Craig W. Reynolds da han oppfant disse oppføringene. Den grunnleggende ideen er å produsere små tilfeldige forskyvninger og gjelde for tegnets nåværende retningsvektor (hastigheten, i vårt tilfelle) hver spillramme. Siden hastighetsvektoren definerer hvor tegnet går til og hvor mye det beveger hver ramme, vil enhver forstyrrelse med den vektoren endre den nåværende ruten.

Ved hjelp av små forskyvninger forhindrer hver ramme tegnet fra å abrupt endre ruten. Hvis tegnet beveger seg og dreier til høyre, for eksempel i den neste spillrammen, vil det fortsatt bevege seg opp og dreie til høyre, men i en litt annen vinkel.

Denne tilnærmingen kan også implementeres på forskjellige måter. En av dem er å bruke en sirkel foran tegnet, ved å bruke det for å beregne alle involverte krefter:

De forskyvningskraft  har sin opprinnelse i sirkelens senter, og er begrenset av sirkelradiusen. Jo større radius og avstanden fra karakter til sirkelen, desto sterkere vil "push" karakteren få hver spillramme.

Denne forskyvningskraften vil bli brukt til å forstyrre karakterens rute. Det brukes til å beregne vandre kraft.


Beregning av sirkelens posisjon

Den første komponenten som kreves for å beregne vandringskraften, er sirkelens midtstilling. Siden sirkelen skal plasseres foran tegnet, kan hastighetsvektoren brukes som en veiledning:

 // CIRCLE_DISTANCE konstanten nedenfor er // et nummer som er definert et annet sted. // Koden for å beregne sirkelsenteret: var circleCenter: Vector3D; circleCenter = hastighet.klone (); circleCenter.normalize (); circleCenter.scaleBy (CIRCLE_DISTANCE);

De circleCenter vektoren over er en klone (kopi) av hastighetsvektoren, som betyr at de peker mot samme retning. Det er normalisert og multiplisert med en skalarverdi (CIRCLE_DISTANCE, i dette tilfellet) som vil resultere i følgende vektor:


Forskyvningskraft

Den neste komponenten er forskyvningskraften, som er ansvarlig for høyre eller venstre sving. Siden dette er en kraft som brukes til å produsere forstyrrelse, kan den peke hvor som helst. La oss bruke en vektor justert med Y-aksen:

 var forskyvning: Vector3D; forskyvning = ny Vector3D (0, -1); displacement.scaleBy (CIRCLE_RADIUS); // / Tilfeldig endre vektorretningen // ved å gjøre den endre sin nåværende vinkel setAngle (displacement, wanderAngle); // / / Change wanderAngle bare litt, så det / / vil ikke ha samme verdi i // neste spillramme. wanderAngle + = (Math.random () * ANGLE_CHANGE) - (ANGLE_CHANGE * .5);

Forflyttningskraften opprettes og skaleres av sirkelradiusen. Som tidligere beskrevet, jo større radius, desto sterkere svinger kraften. De wanderAngle er en skalarverdi som definerer hvor mye forskyvningskraften skal "vippes" etter at den er brukt, blir en tilfeldig verdi lagt til for å gjøre det annerledes for neste spillramme. Den produserer den nødvendige tilfeldigheten i bevegelsen.

For å forstå forståelsen, la oss anta at forskyvningskraften beregnet ovenfor er plassert i sirkelens senter. Siden det ble skalert av sirkelradiusverdien, ville det være noe slikt:

Tips: Husk at mattevektorer ikke har plass i rommet, de har en retning og en størrelse (lengde). Som en konsekvens kan de plasseres hvor som helst.

Wander Force

Etter at sirkelsenteret og forskyvningsvektoren er beregnet, må de kombineres for å produsere vandre kraft. Den styrken beregnes ved å legge til de to vektorene:

 var wanderForce: Vector3D; wanderForce = circleCenter.add (forskyvning);

Vi kan visuelt representere disse styrkene slik:

Vandringsstyrken kan forestilles som en vektor som går fra tegnet til et punkt på sirkelens omkrets. Avhengig av posisjonen til det punktet, vil vandringskraften skyve karakteren til venstre eller til høyre, sterkt eller svakt:

Jo mer vandringskraften er justert med hastighetsvektoren, desto mindre vil tegnet endre sin nåværende rute. Vandringsstyrken vil fungere akkurat som søken og flykte styrker: den vil skyve karakteren mot en retning.

I likhet med å søke og fly hvor kraftretningen beregnes ut fra et mål, beregnes vandringsretningen basert på et tilfeldig punkt på sirkelens omkrets. Den endelige koden for vandringsstyrken er:

 privat funksjon vandre (): Vector3D // Beregn sirkelsenteret var circleCenter: Vector3D; circleCenter = hastighet.klone (); circleCenter.normalize (); circleCenter.scaleBy (CIRCLE_DISTANCE); // // Beregn forskyvningskraftens forskyvning: Vector3D; forskyvning = ny Vector3D (0, -1); displacement.scaleBy (CIRCLE_RADIUS); // / Tilfeldig endre vektorretningen // ved å gjøre den endre sin nåværende vinkel setAngle (displacement, wanderAngle); // / / Change wanderAngle bare litt, så det / / vil ikke ha samme verdi i // neste spillramme. wanderAngle + = Math.random () * ANGLE_CHANGE - ANGLE_CHANGE * .5; // // Endelig beregne og returnere vandringskraften var wanderForce: Vector3D; wanderForce = circleCenter.add (forskyvning); returnere wanderForce;  offentlig funksjon setAngle (vektor: Vector3D, verdi: tall): void var len: Number = vector.length; vector.x = Math.cos (verdi) * len; vector.y = Math.sin (verdi) * len; 

Legge til styrker

Etter at vandringsstyrken er beregnet, må den legges til karakterens hastighet, slik at den kan påvirke bevegelsen. Tillegget av den kraften utføres på samme måte som før:

 styring = styring () styring = trunkering (styring, maks_force) styring = styring / masshastighet = trunkering (hastighet + styring, maks_speed) posisjon = posisjon + hastighet

Vandringskraften vil påvirke karakterens rute på samme måte som de tidligere beskrevne oppføringene gjorde, med den forskjellen at den skyver tegnet til en tilfeldig retning hver spillramme:


Den vandrende oppførselen. Klikk på demoen for å vise kraftvektorer.

Demoen ovenfor viser flere tegn som vandrer i miljøet. Hvis de forlater skjermen, blir de respawned i sentrum.


Konklusjon

Vandringsoppførelsen er en utmerket måte å gjennomføre tilfeldige bevegelser på. Den styres av en imaginær sirkel plassert foran karakteren, som kan tweaked for å produsere ønsket bevegelsesmønster.

Denne opplæringen beskriver styringsadferd, som forklarer vandringsoppførelsen. I neste innlegg lærer vi om mer oppførsel. Hold deg oppdatert ved å følge oss på Twitter, Facebook eller Google+.