Laser Generator, hindringer og nøyaktig Hit Detection

Hei venner. Hovedpunktet i denne opplæringen er korrekt slå påvisning av en generert laser. Denne typen AI er nyttig i å lage actionspill, spesielt når det gjelder sikkerhetsinformasjon med kameraer, laserpistoler osv. Så legg raketten på ryggen din, nedtellingen starter?


Endelig resultatforhåndsvisning

La oss se på det endelige resultatet vi vil jobbe for:


Trinn 1: Forbereder Flash-fil

Åpne Flash og opprett et nytt Flash-dokument (ActionScript 3.0).

Angi scenestørrelse til en hvilken som helst standardoppløsning. Gruven er 500 x 350 px.

Still inn bildefrekvens til 24 fps.

Lagre filen i en mappe etter eget valg.


Trinn 2: Opprette lasergeneratorenhet

La oss nå lage en lasergenerator.

Tegn en sirkel med radius 20, det vil si 40 x 40. Fyll også den med litt fin radial gradientfarge.

Nå må vi konvertere denne sirkelen til et Flash-symbol, slik at vi kan kontrollere det med ActionScript.

Velg sirkelen og trykk F8 eller gå til Endre> Konverter til symbol. Velg Filmklipp for symboltypen. Sett også registreringspunktet slik at lasergeneratoren roterer fra sentrum. Type laserGenerator_MC i eksempelnavnfelt og deretter sist men ikke minst sjekk "Export for ActionScript" i "Advanced" gruppen slik at vi kan få tilgang til lasergeneratoren fra vår dokumentklasse som vi skal møte snart.

Etter å ha satt alle de ovennevnte alternativene, trykk OK. Trykk OK igjen for dialogboksen som viser advarselen for klasses Definisjon. Dette vil skape en klasses definisjon for lasergenerator ved kjøring.

Nå trenger vi ikke laserGenerator_MC symbol på scenen siden den er tilgjengelig i bibliotekspanelet med identifikasjonsnavn laserGenerator_MC. Slett derfor dette symbolet fra scenen. Din scene skal være tom nå.


Trinn 3: Forbedre utseendet til lasergeneratoren

Nå skal vi legge til en munn til denne generatoren for å skape en følelse av en enhet. Dobbeltklikk på bibliotekspanelet laserGenerator_MC symbolikon (venstre side av symbolnavnet) for å gå inn i redigeringsmodus. Legg munnen til den som vist nedenfor.

Du er velkommen til å legge til ditt eget design.

Merk: Ikke endre sirkelens posisjon siden vi må rotere den rundt senteret.

Etter å ha lagt en munn til generatoren, gå ut av symbolredigeringsmodus og kom tilbake til hoved tidslinjen.

Din rakett har forlatt bakken. Lasergeneratorenheten er klar og venter på å utføre.


Trinn 4: Klargjøre dokumentklasse

For å legge til et drama til vår scene trenger vi ActionScript. For å handle smart trenger vi dokumentklasse.

I dette trinnet skal vi opprette en grunnleggende struktur for vår dokumentklasse.

For detaljerte forklaringer om dokumentklasse, sjekk ut denne raske tipsen.

Så opprett ny ActionScript 3.0-fil. Skriv inn følgende kode:

 pakke offentlig klasse Laser_HitDetection offentlig funksjon Laser_HitDetection () // constructor code

Lagre dette dokumentet som Laser_HitDetection.as i samme mappe hvor du lagret FLA for denne opplæringen. Hyggelig ta av. Din grunnleggende dokumentklasse er klar.


Trinn 5: Fest dokumentklasse til FLA

I din FLA-filtilgang, velg Egenskaper panelet for Dokumentet og skriv navnet på klassen i Dokumentklasse-feltet som er tilgjengelig under "Publiser" -gruppen.

Nå er vi klare til å kommunisere med FLA gjennom dette Laser_HitDetection.as dokument klasse.


Trinn 6: Plasser og juster lasergeneratoren på trinnsenteret

Vi skal skape en forekomst av lasergenerator fra biblioteket og plassere den til sentrum av scenen.

Endre Laser_HitDetection.as dokumentklasse som vist nedenfor (uthevede linjer):

 pakke import flash.display.Sprite; offentlig klasse Laser_HitDetection utvider Sprite var laserGun: Sprite; // Instans av laserGenerator_MC // Konstruktørens offentlige funksjon Laser_HitDetection () CreateLaserGun ();  // Hent og plasser lasergenerator fra bibliotekets offentlige funksjon CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Hent den fra biblioteket addChild (laserGun); // Plasser lasergeneratoren i midten av scenen laserGun.x = stage.stageWidth / 2; laserGun.y = scene.stageHeight / 2; 

Hvis du tester filmen nå, ser du vår laserpistol pent plassert i midten av scenen.


Trinn 7: Forståelse CreateLaserGun () metode

I ovennevnte kode brukte vi Sprite klasse for å lage en forekomst av Sprite-objekt som vil holde laser. For det erklærer vi variabel som:

 var laserGun: Sprite;

Da la vi til en ny metode "CreateLaserGun ()"der vi tilordnet en forekomst av laserGenerator_MC fra biblioteket til ovenstående laserGun var som:

 laserGun = ny laserGenerator_MC ();

Etter å ha lagt den til scenen plasserte vi den i midten av scenen som:

 laserGun.x = scene.stageWidth / 2; laserGun.y = scene.stageHeight / 2;

Til slutt kalte vi denne metoden fra konstruktørmetoden til dokumentklassen som:

 // Konstruktørens offentlige funksjon Laser_HitDetection () CreateLaserGun (); 

Raket akselererer med full trykk. Vi skal aktivere denne laserpistolen veldig snart som vil projisere laseren. Før det skal vi legge til noen hindringer. La oss gå.


Trinn 8: Legge til hindringer av forskjellige former

For å eksperimentere med hitdeteksjon trenger vi noen hindringer plassert på scenen. Så, på scenen tegne forskjellige former som ligner konvekse-konkav overflater, skråklatring og rette kanter, som vist nedenfor:


Trinn 9: Konvertering av alle hindringer i Single MovieClip

Nå skal vi sette alle disse figurene i ett symbol. Velg alle figurer samtidig, og trykk på F8 eller gå til Endre> Konverter til symbol. Velg Filmklipp som symboltype. Gi dette symbolet navnet obstacles_MC i navnet tekstfelt. Sett inn registreringspunkt i sentrum. Sjekk også "Export for ActionScript" slik at vi kan få tilgang til den fra vår dokumentklasse.

Etter konvertering til MovieClip har vi obstacles_MC i biblioteket med samme identifikasjonsnavn. Simlilary as laserGenerator_MC Vi trenger ikke dette symbolet på scenen, så slett det fra scenen. Nå er scenen din tom.


Trinn 10: Plasser og korrigér forhindringssymbolet på scenesenteret

Måten vi plasserte vår laserGenerator_MC videre til scenen, i sentrum, på samme måte skal vi plassere obstacles_MC symbol på scenen. Endre dokumentklassen som vist nedenfor:

 pakke import flash.display.Sprite; offentlig klasse Laser_HitDetection utvider Sprite var laserGun: Sprite; // Instans av laserGenerator_MC var hindringer: Sprite; // Forekomst av hindringer_MC // Konstruktørens offentlige funksjon Laser_HitDetection () CreateLaserGun (); CreateObstacles ();  // Hent og plasser lasergenerator fra bibliotekets offentlige funksjon CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Hent den fra biblioteket addChild (laserGun); // Plasser lasergeneratoren i midten av scenen laserGun.x = stage.stageWidth / 2; laserGun.y = scene.stageHeight / 2;  // Hent og plasser hindringer fra bibliotekets offentlige funksjon CreateObstacles (): void obstacles = new obstacles_MC (); // Hent det fra biblioteket addChild (hindringer); // Sett hindringer i midten av scenen obstacles.x = stage.stageWidth / 2; obstacles.y = scene.stageHeight / 2; 

Test filmen for å se hindringer plassert rundt laserpistolen.

Din rakett når terminalhastighet. Nå er det på tide å aktivere laserpistolen. Det må generere laseren fra den. La oss gjøre det nå.


Trinn 11: Projiserende laser

Hvordan vil vi etterligne laseren? Noen gjetning ?? Hva med å bruke noen medlemmer av grafikklassen som linestyle (), flytte til(), lineTo (). Hvis du er kjent med disse metodene, er jobben din enkel. For de som ikke kjenner disse metodene, er vi alltid med deg. La oss se dem i detalj.

Vi skal legge til en ny metode ProjectLaser (). La oss endre vår Laser_HitDetection dokumentklasse som vist nedenfor:

 // Constructor pakke import flash.display.Sprite; offentlig klasse Laser_HitDetection utvider Sprite var laserGun: Sprite; // Instans av laserGenerator_MC var hindringer: Sprite; // Instans av hindringer_MC var laser: Sprite; var startX: tall; // x startpunkt for laser var startY: Nummer; // y utgangspunkt for laser var endX: Number; // x sluttpunkt av laser var slutt: Nummer; // y endepunkt av laser // Konstruktør offentlig funksjon Laser_HitDetection () CreateLaserGun (); CreateObstacles (); ProjectLaser ();  // Hent og plasser lasergenerator fra bibliotekets offentlige funksjon CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Hent den fra biblioteket addChild (laserGun); // Plasser lasergeneratoren i midten av scenen laserGun.x = stage.stageWidth / 2; laserGun.y = scene.stageHeight / 2;  // Hent og plasser hindringer fra bibliotekets offentlige funksjon CreateObstacles (): void obstacles = new obstacles_MC (); // Hent det fra biblioteket addChild (hindringer); // Sett hindringer i midten av scenen obstacles.x = stage.stageWidth / 2; obstacles.y = scene.stageHeight / 2;  // Prosjekt en laser fra lasergeneratorenheten offentlig funksjon ProjectLaser (): void laser = new Sprite (); addChild (laser); // Sett laserens opprinnelse som midten av laserpistolen startX = laserGun.x; startY = laserGun.y; // Sett sluttpunktet til laser endX = startX + 230; endy = startY; // Tegn laser laser.graphics.lineStyle (1, 0xFF0000); laser.graphics.moveTo (startX, startY); laser.graphics.lineTo (endX, endY); 

Test filmen.

Raketen er der oppe i himmelen. Laserpistolen har begynt å projisere laseren. Hvordan skjedde det? La oss prøve å forstå koden ovenfor i neste trinn.


Trinn 12: Hvordan er laserprojisert?

I det ovennevnte trinnet projiserte vi vellykket en laser. For det har vi utført følgende oppgaver:

Først erklærte vi fem nye variabler:

 var laser: Sprite; var startX: tall; // x startpunkt for laser var startY: Nummer; // y utgangspunkt for laser var endX: Number; // x sluttpunkt av laser var slutt: Nummer; // y endepunkt av laser

For det andre legger vi til en ny metode ProjectLaser ():

 offentlig funksjon ProjectLaser (): void laser = new Sprite (); addChild (laser); // Sett laserens opprinnelse som midten av laserpistolen startX = laserGun.x; startY = laserGun.y; // Sett sluttpunktet til laser endX = startX + 230; endy = startY; // Tegn laser laser.graphics.lineStyle (1, 0xFF0000); laser.graphics.moveTo (startX, startY); laser.graphics.lineTo (endX, endY); 

Trinn 13: Forståelse ProjectLaser () Metode

I ovennevnte metode først opprettet vi et tomt Sprite-objekt for å holde laseren og også lagt den til scenen som vist nedenfor:

 laser = ny Sprite (); addChild (laser);

Da vi ønsket at laseren skulle begynne å projisere fra laserpistolen, tildelte vi laserpistolens X-verdi til startx og Y verdien til starty som vist under:

 startX = laserGun.x; startY = laserGun.y;

(Senere ga vi disse verdiene til moveTo (startX, startY) metode som vi skal møte snart.)

Da definerte vi endX og endy:

 endX = startX + 230; endy = startY;

Verdier tilordnet over variabler er midlertidige verdier. Vi brukte dem bare for å vise den grunnleggende projeksjonen av en laser. I kommende trinn skal vi endre disse verdiene ved å bruke litt enkel matte. Disse verdiene er nøkkelen til å lage perfekt hitdeteksjon av laseren. Vi skal studere dem senere i denne sesjonen.

Og nå er den viktige delen av denne metoden. Tegner en rett linje i laser sprite objekt for å etterligne den projiserte laser.

Først håndterte vi stilen på linjen som skal tegnes som vist nedenfor:

 laser.graphics.lineStyle (1, 0xFF0000);

Denne lineStyle () -metoden brukes til å kontrollere utformingen av strekket til tegningsobjektet, for eksempel linje, rektangel, oval etc. Du kan gi maksimalt åtte argumenter til denne metoden. Hvis ikke spesifisert, blir standardverdiene tilordnet i stedet. For vårt eksempel trenger vi bare to argumenter. Det første argumentet er tykkelsen på linjen (dvs. 1) og det andre argumentet er linjens farge (dvs.. 0xff0000, som er rød).

For detaljert forklaring av denne metoden, se Adobe Help doc på "lineStyle (args?)" -Metoden.

Deretter plasserte vi utgangspunktet for linjen som vist nedenfor:

 laser.graphics.moveTo (startX, startY);

startx og starty sikrer at utgangspunktet må være sentrum av laserpistolen.

Etter det finsihed vi opp linjen:

 laser.graphics.lineTo (endX, endY);

Husk at disse endX og endy er midlertidige verdier bare for å vise projeksjonen. Vi trenger dem til å bli justert hvis noen hindringer kommer i veien for laser. Vi skal gjøre det matte i kommende trinn.

Så, vi tegnet en linje fra (startx, starty) til (endX, endy).

Raketen går og går. Se disse landskapene, vannkilder?

Nå er det på tide for den virkelige handlingen. Hit deteksjon med hindringer.


Trinn 14: Hit Detection With Obstacles

Nå er vi utstyrt med en laserpistol. Vi har også flere hindringer. Vi er på det nivået der vi kan legge hitdeteksjon som sikkert vil legge til meningen med scenen.

Du kan tenke at denne svært nøyaktige gjenkjenningen vil kreve komplisert matte. I så fall er du feil. Den bruker bare hitTestPoint () innebygd metode for ActionScript sammen med a til sløyfe. Den komplekse matematikken bak perfekt hitdeteksjon håndteres av denne metoden. Du trenger bare å benytte denne metoden og a til sløyfe på en smart måte.

Vi skal gjøre noen viktige endringer i vår dokumentklasse hovedsakelig til ProjectLaser () metode og litt ny vars, så følg og bruk den nøye. La oss endre det som vist:

Først legg til disse nye vars:

 var rad: Nummer = Math.PI / 180; // Brukes til å beregne vinkel i radianer var maxDist: Nummer = 250; // Maksimal avstand for å bli reist av laseren var justertDist: Nummer; // Ny maksimal avstand hvis noen hindring kommer på en måte

Endre deretter ProjectLaser () metode ved å legge til til sløyfe som vist nedenfor (merk også det nå endX og endy er inne til loop):

 // Prosjekt en laser fra lasergeneratorenhetens offentlige funksjon ProjectLaser (): void laser = new Sprite (); addChild (laser); // Sett laserens opprinnelse som midten av laserpistolen startX = laserGun.x; startY = laserGun.y; for (adjustedDist = 0; adjustedDist < maxDist; adjustedDist ++)  //Trigonometry to aim the laser w.r.t laser gun's rotation endX = laserGun.x + Math.cos ( laserGun.rotation * rad ) * adjustedDist; endY = laserGun.y + Math.sin ( laserGun.rotation * rad ) * adjustedDist; //calculate hit test if ( obstacles.hitTestPoint ( endX, endY, true ) )  break;   //Draw laser laser.graphics.lineStyle( 1, 0 x FF0000 ); laser.graphics.moveTo( startX, startY ); laser.graphics.lineTo ( endX, endY ); 

Test filmen.

boom? Jeg er sikker. Når du ser på denne effekten, er du inspirert til å lage et Flash Game med sikkerhetsinformasjon. Perfekt AI, for å utvikle spennende spill i Flash.


Trinn 15: Hvordan Hit Detection Happened

Først og fremst har vi lagt til ny vars til vår dokumentklasse som vist:

I utgangspunktet en vinkel i radianer

 var rad: Nummer = Math.PI / 180; // Brukes til å beregne vinkel i radianer

Ovennevnte var brukes i formel for å beregne en vinkel i radianer.

Formelen er, radianer = grader * Math.PI / 180. Mer info her. Vi brukte denne formelen i vår kode, i disse linjene:

 endX = laserGun.x + Math.cos (laserGun.rotation * rad) * adjustedDist; endy = laserGun.y + Math.sin (laserGun.rotation * rad) * adjustedDist;

I laserGun.rotation * rad, grader = laserGun.rotation, og rad = Math.PI / 180.

For det andre opprettet vi en var for maksimal avstand som skal reises av laseren:

 var maxDist: Nummer = 250; // maksimal avstand som skal reises av laseren

Dette var bestemmer den maksimale avstanden som skal reises av laseren. Siden det ikke er nødvendig å tegne laser utover synlig område, definerer vi et fint sluttpunkt. Dette var vil gjøre det som trengs.

Tredje, vi har en var for den nåværende avstanden til laseren på kryssetiden med enhver hindring.

 var justertDist: Nummer; // Ny maksimal avstand hvis noen hindring kommer på en måte

Når noen hindring kommer i veien for laser, er laseren blokkert i stedet for å reise til maksimal avstand.

Avstanden etter å blokkere en laser er ingenting annet enn den justerte avstanden avhengig av situasjonen.

De til loop og hitTestPoint () hver spiller en viktig rolle i beregningen av denne avstanden.

For det fjerde endret vi ProjectLaser () metode ved å legge til ActionScript hitTestPoint () sammen med en til sløyfe. Vi tilordnes endX og endy variabler.

 for (adjustedDist = 0; adjustedDist < maxDist; adjustedDist ++)  //Trigonometry to aim the laser w.r.t laser gun's rotation endX = laserGun.x + Math.cos ( laserGun.rotation * rad ) * adjustedDist; endY = laserGun.y + Math.sin ( laserGun.rotation * rad ) * adjustedDist; //calculate hit test if ( obstacles.hitTestPoint ( endX, endY, true ) )  break;  

Forløp sikrer at den justerte avstanden økes opp til maksimal avstand. Du kan tenke "Hva er det gøy med å gjøre justert avstand lik maksimal avstand?"

Faktisk er denne justerte avstanden tillatt å matche maksimal avstand naturlig, men så snart det treffer eventuelle hindringer (som detekteres av hitTestPoint () metode) denne avstanden er merket som maksimal avstand for den aktuelle situasjonen. Takk til hitTestPoint () for å gjøre oppgaven så enkel.

Vi har også tilordnet seg endX og endy verdier som:

 endX = laserGun.x + Math.cos (laserGun.rotation * rad) * adjustedDist; endy = laserGun.y + Math.sin (laserGun.rotation * rad) * adjustedDist;

Trigonometrien fungerer Math.cos () og Tak i Math.sin () brukes til å beregne vinkelen på laser w.r.t laser pistol rotasjon.

I enkel form tar det seg sikte på å sikte mot laseren hvor laserpistolen ser ut. Det er viktig at laserpistol og laser begge er synkronisert. Så når laserpistolen roteres, vil laseren følge rotasjonen.

For mer informasjon om trigonometri, les denne Quick Tip.

Til slutt klimaks av scenen:

 hvis (obstacles.hitTestPoint (endX, endy, true)) break; 

hitTestPoint () Metoden tar tre parametre, hvorav den første og andre parametre er nødvendige, og den tredje (shapeflag) vil bli igjen som standard (dvs.. falsk) hvis ikke spesifisert.

I vårt eksempel, shapeflag er satt til ekte siden vi vil slå gjenkjenning med hensyn til den nøyaktige formen på målobjektet (dvs.. hindringer). Hvis denne verdien er satt til falsk hitdetektering skjer med hensyn til grenseboksen til objektet og ikke den eksakte form.

Den første og andre parametere for hitTestPoint () definer et punkt (x, y) for å se etter skjæringspunktet med skjermobjektet. I vårt tilfelle hindringer er det visningsobjektet, og endX og endy representerer skjæringspunktet på scenen.

Uklar? Ikke sant. For å forenkle skal vi legge logikken i rekkefølge som følger:

  1. De til sløyfe tillater fremdriften av laseren å fortsette (ved å oppdatere endX og endy) hvis innenfor maksimal avstand.
  2. hitTestPoint () venter på å bryte til loop så snart det ser krysset. Først når til sløyfen er ødelagt, endX og endy er frosset.
  3. Til slutt disse frosne endX og endy blir sendt til graphics.lineTo () metode.

Trinn 16: Bruk rotasjon til laserpistol

For å legge til rotasjon til laserpistol må vi utføre noen store endringer:

  1. Re-Strukturering ProjectLaser () metode.
  2. Plasser hele hitdeteksjonslogikken i ny metode HitTest ().
  3. Legger til ny setning laser.graphics.clear () i til sløyfe.
  4. Import uttalelse importer flash.events.Event

Først skal vi omstrukturere ProjectLaser () metode ved å skifte hele treffdeteksjonslogikken i ny metode HitTest ().

Da skal vi legge til laser.graphics.clear () uttalelse før laser.graphics.lineStyle (1, 0xFF0000) uttalelse inne i til sløyfe av ny metode HitTest (). Dette vil fjerne den gamle projeksjonen fra laseren fra scenen når laserpistolen begynner å rotere.

La oss se hvordan det vil passe på å gjøre alle fire store endringene:

 offentlig funksjon ProjectLaser (): void laser = new Sprite (); addChild (laser); // Sett laserens opprinnelse som midten av laserpistolen startX = laserGun.x; startY = laserGun.y;  // Hit test offentlig funksjon HitTest (): void for (adjustedDist = 0; adjustedDist < maxDist; adjustedDist ++)  //Trigonometry to aim the laser w.r.t laser gun's rotation endX = laserGun.x + Math.cos(laserGun.rotation * rad) * adjustedDist; endY = laserGun.y + Math.sin(laserGun.rotation * rad) * adjustedDist; //calculate hit test if (obstacles.hitTestPoint(endX,endY,true))  break;   //Draw laser laser.graphics.clear(); //Removes the old laser projection laser.graphics.lineStyle( 1, 0xFF0000 ); laser.graphics.moveTo( startX, startY ); laser.graphics.lineTo ( endX, endY ); 

Du kan spørre hvorfor vi gjorde slike store endringer? Den eneste grunnen er ENTER_FRAME begivenhet.

For å bruke kontinuerlig rotasjon skal vi legge til en ny metode, LaserGunRotation (evt: Event) som er aktivert av ENTER_FRAME hendelse (det betyr at det kjøres 24 ganger i sekundet, siden vår bildefrekvens er 24 fps). Når denne hendelsen blir brukt, må du være forsiktig med å legge til bare slike egenskaper som vi vil endre over tid. Unngå å sette inn de verdiene som forblir konstant gjennom hele utførelsen.

I vårt tilfelle, hvis du observerer gammel ProjectLaser () metode har den:

 laser = ny Sprite (); addChild (laser); // Roter laserpistol

Tenk deg om du legger til over setninger i en metode som bruker ENTER_FRAME begivenhet; da vil en ny Laser Sprite-gjenstand bli opprettet og lagt til scenen flere ganger - 24 ganger hvert sekund.

Dette er absolutt unødvendig. Derfor omstrukturert vi ProjectLaser () metode og lagt til ny metode HitTest (). Du kan gi nytt navn ProjectLaser () metode til InitializeLaser () siden det ikke lenger projiserer laseren. Nå skaper det bare den tomme holderen for laseren og definerer utgangspunktet. Projeksjonen håndteres i en ny metode, HitTest ().

La oss nå se den nye metoden LaserGunRotation (evt: Event). Før dette legger du til følgende importoppgave ved starten av dokumentklassen:

 importere flash.events.Event;

Og legg til følgende metode:

 // Rotate Laser Gun offentlig funksjon LaserGunRotation (evt: Event): void laserGun.rotation + = 0.5; HitTest (); 

Ikke glem å ringe denne metoden med en ENTER_FRAME hendelsen inne i konstruktørfunksjonen som vist nedenfor:

 // Konstruktørens offentlige funksjon Laser_HitDetection () CreateLaserGun (); CreateObstacles (); ProjectLaser (); addEventListener (Event.ENTER_FRAME, LaserGunRotation); 

Dette setter det opp for å kjøre LaserGunRotation () funksjon 24 ganger i sekundet.

Test filmen.

Raketen har allerede penetrert skyer. Se den vakre jorden.


Trinn 17: Legge til kontroll for nøyaktigheten av treffdeteksjon

I dette trinnet skal vi legge til en kontroll for å justere nøyaktigheten av treffdeteksjonen. Dette er viktig siden du ikke trenger den nøyaktige gjenkjenningen hver gang; Det kan hende du trenger et gjennomsnittlig nivå av trefffeil. Dette vil også bidra til å redusere CPU forbruket på tidspunktet for hitdeteksjon.

Vi skal introdusere en ny variabel toleranse som:

 var toleranse: tall = 1;

Da skal vi modifisere til sløyfe økningen setning som:

 for (adjustedDist = 0; adjustedDist < maxDist; adjustedDist += tolerance)

Nå ser forløpet ut:

 for (adjustedDist = 0; adjustedDist < maxDist; adjustedDist += tolerance)  //Trigonometry to aim the laser w.r.t laser gun's rotation endX = laserGun.x + Math.cos(laserGun.rotation * rad) * adjustedDist; endY = laserGun.y + Math.sin(laserGun.rotation * rad) * adjustedDist; //calculate hit test if (obstacles.hitTestPoint(endX,endY,true))  break;  

Dette betyr at i stedet for å sjekke for en kollisjon på hver piksel av laserlinjen, kontrollerer vi bare for en kollisjon ved hver annen piksel eller hver tredje piksel osv..

Ved å redusere verdien for "toleranse" økes nøyaktigheten av treffdeteksjonen, men krever mer CPU-effekt. Prøv å eksperimentere med forskjellige verdier for "toleranse".

Venner, det er på tide å forlate raketten og åpne fallskjermen. Land trygt på bakken og begynn å bruke ovennevnte teknikk i dine Flash-spill og -applikasjoner. Nyt!


Konklusjon:

I denne opplæringen så vi hovedsakelig den perfekte utnyttelsen av hitTestPoint () og a til sløyfe for å opprette nøyaktig gjenkjenning uten å bruke komplisert matte.

Denne effekten kan brukes i et sikkerhetstype actionspill hvor kameraer og laserpistoler er påkrevd.