Lasergenerator, hinder och exakt träffdetektering

Hej vänner. Huvudpunkten i denna handledning är exakt träffdetektering av en genererad laser. Denna typ av AI är användbar för att göra actionspel, speciellt när det gäller säkerhetsunderrättelse med kameror, laserpistoler etc. Så sätt din raket på ryggen, nedräkningen startar?


Slutresultatförhandsvisning

Låt oss ta en titt på det slutliga resultatet vi ska arbeta för:


Steg 1: Förbereda Flash-fil

Öppna Flash och skapa ett nytt Flash-dokument (ActionScript 3.0).

Ange scenstorlek till vilken standardupplösning som helst. Gruvan är 500 x 350 px.

Ställ in bildhastighet till 24 bilder / sek.

Spara filen i en valfri mapp.


Steg 2: Skapa en lasergenerator

Låt oss nu skapa en lasergenerator.

Rita en cirkel med radie 20, d.v.s. 40 x 40. Fyll den också med en fin radiell gradientfärg.

Nu måste vi konvertera denna cirkel till en Flash-symbol så att vi kan styra den med ActionScript.

Välj cirkeln och tryck på F8 eller gå till Ändra> Konvertera till symbol. Välj filmklipp för symboltypen. Ställ även in registreringspunkten så att lasergeneratorn roterar från centrum. Typ laserGenerator_MC till exempel namnfält och senast men inte minst checka "Export for ActionScript" i "Advanced" -gruppen så att vi kan komma åt lasergenerator från vår dokumentklass som vi ska träffas snart.

När du har ställt in alla ovanstående alternativ trycker du på OK. Tryck på OK igen för dialogrutan som visar varningen för klassdefinition. Detta kommer att skapa en klassdefinition för lasergenerator vid körning.

Nu behöver vi inte laserGenerator_MC symbol på scenen eftersom den är tillgänglig i bibliotekspanelen med identifieringsnamn laserGenerator_MC. Ta bort den här symbolen från scenen. Din scen ska vara tom nu.


Steg 3: Förbättra utseendet av lasergenerator

Nu ska vi lägga till en mun till denna generator för att skapa en känsla av en enhet. Dubbelklicka på bibliotekspanelen laserGenerator_MC symbolikonen (vänster sida av symbolnamnet) för att gå till redigeringsläget. Lägg till mun på det enligt bilden nedan.

Känn dig fri att lägga till din egen design.

Notera: Ändra inte cirkelns position eftersom vi behöver rotera den runt dess centrum.

Efter att du har lagt till en mun på generatorn, gå ur symbolredigeringsläget och återgå till huvudtidslinjen.

Din raket har lämnat marken. Lasergeneratoranordningen är klar och väntar på att utföra.


Steg 4: Förberedelse av dokumentklass

För att lägga till ett drama till vår scen behöver vi ActionScript. För att agera smart behöver vi dokumentklass.

I detta steg ska vi skapa en grundläggande struktur för vår dokumentklass.

För detaljerad förklaring om dokumentklass, kolla in denna snabba tips.

Så skapa en ny ActionScript 3.0-fil. Skriv följande kod:

 paket offentlig klass Laser_HitDetection offentlig funktion Laser_HitDetection () // constructor code

Spara detta dokument klass som Laser_HitDetection.as i samma mapp där du sparade din FLA för denna handledning. Trevligt ta av. Din grundläggande dokumentklass är klar.


Steg 5: Anslut dokumentklass till FLA

I din FLA-filåtkomst öppnar du Egenskaper-panelen för dokumentet och skriver namnet på klassen i dokumentklassfältet som är tillgängligt under "Publicera" -gruppen.

Nu är vi redo att kommunicera med FLA genom detta Laser_HitDetection.as dokument klass.


Steg 6: Placera och rikta lasergenerator vid Stage Center

Vi ska skapa en instans av lasergenerator från biblioteket och placera den i mitten av scenen.

Ändra Laser_HitDetection.as dokumentklass enligt nedan (markerade linjer):

 paket import flash.display.Sprite; offentlig klass Laser_HitDetection utökar Sprite var laserGun: Sprite; // Instans av laserGenerator_MC // Konstruktörens offentliga funktion Laser_HitDetection () CreateLaserGun ();  // Hämta och placera lasergenerator från bibliotekets offentliga funktion CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Hämta det från biblioteket addChild (laserGun); // Placera lasergenerator i mitten av scenen laserGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2; 

Om du testar filmen nu ser du vår laserpistol placerad fint i mitten av scenen.


Steg 7: Förståelse CreateLaserGun () metod

I ovanstående kod använde vi Sprite klass för att skapa en förekomst av Sprite-objekt som håller laser. För det förklarar vi variabel som:

 var laserGun: Sprite;

Sedan lade vi till en ny metod "CreateLaserGun ()"där vi tilldelade en instans av laserGenerator_MC från biblioteket till ovanstående laser pistol var som:

 laserGun = ny laserGenerator_MC ();

Efter att ha lagt den till scenen lade vi den i mitten av scenen som:

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

Slutligen kallade vi den här metoden från konstruktormetoden i dokumentklassen som:

 // Konstruktörens offentliga funktion Laser_HitDetection () CreateLaserGun (); 

Raketten accelererar med full dragkraft. Vi ska aktivera denna laserpistol mycket snart som kommer att projicera lasern. Innan det ska vi lägga till några hinder. Nu går vi.


Steg 8: Lägga till hinder av olika former

För att experimentera med träffdetektering behöver vi några hinder placerade på scenen. Så, på scenen teckna olika former som liknar konvexa konkava ytor, sluttningsklättring och raka kanter, som visas nedan:


Steg 9: Konvertera alla hinder till Single MovieClip

Nu ska vi sätta alla dessa former i en symbol. Välj alla former samtidigt och tryck på F8 eller gå till Ändra> Konvertera till symbol. Välj filmklipp som symboltyp. Namn på denna symbol obstacles_MC i namn textfält. Ange registreringspunkt i mitten. Kontrollera även "Exportera för ActionScript" så att vi kan komma åt den från vår dokumentklass.

Efter konverteringen till MovieClip har vi obstacles_MC i biblioteket med samma identifieringsnamn. Simlilary as laserGenerator_MC Vi behöver inte denna symbol på scenen, så ta bort den från scenen. Nu är ditt stadium tomt.


Steg 10: Placera och justera obstaclesymbolen vid Stage Center

Sättet vi placerat vårt laserGenerator_MC vidare till scenen, i mitten, på samma sätt ska vi placera obstacles_MC symbol på scenen. Ändra dokumentklassen enligt nedan:

 paket import flash.display.Sprite; offentlig klass Laser_HitDetection utökar Sprite var laserGun: Sprite; // Instans av laserGenerator_MC var hinder: Sprite; // Instans av hinder_MC // Konstruktörens offentliga funktion Laser_HitDetection () CreateLaserGun (); CreateObstacles ();  // Hämta och placera lasergenerator från bibliotekets offentliga funktion CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Hämta det från biblioteket addChild (laserGun); // Placera lasergenerator i mitten av scenen laserGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2;  // Hämta och placera hinder från bibliotekets offentliga funktion CreateObstacles (): void obstacles = new obstacles_MC (); // Hämta det från biblioteket addChild (hinder); // Placera hinder i mitten av scenen obstacles.x = stage.stageWidth / 2; hinder.y = stadium.stageHeight / 2; 

Testa filmen för att se hinder placerade runt laserpistolen.

Din raket når terminalhastighet. Nu är det dags att aktivera laserpistolen. Det måste generera lasern från det. Låt oss göra det nu.


Steg 11: Projektionslaser

Hur kommer vi efterlikna lasern? Någon gissning ?? Vad sägs om att använda några medlemmar i Grafik klassen som linestyle (), flytta till(), lineTo (). Om du är bekant med dessa metoder är ditt jobb enkelt. För dem som inte känner till dessa metoder är vi alltid med dig. Låt oss se dem i detalj.

Vi ska lägga till en ny metod ProjectLaser (). Låt oss ändra vår Laser_HitDetection dokumentklass enligt nedan:

 // Constructorpaketet import flash.display.Sprite; offentlig klass Laser_HitDetection utökar Sprite var laserGun: Sprite; // Instans av laserGenerator_MC var hinder: Sprite; // Instans av hinder_MC var laser: Sprite; var startX: Number; // x startpunkten för laser var startY: Nummer; // y utgångspunkten för laser var endX: Number; // x slutpunkten för laser var än: Nummer; // y slutpunkten för laser // Konstruktörens offentliga funktion Laser_HitDetection () CreateLaserGun (); CreateObstacles (); ProjectLaser ();  // Hämta och placera lasergenerator från bibliotekets offentliga funktion CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Hämta det från biblioteket addChild (laserGun); // Placera lasergenerator i mitten av scenen laserGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2;  // Hämta och placera hinder från bibliotekets offentliga funktion CreateObstacles (): void obstacles = new obstacles_MC (); // Hämta det från biblioteket addChild (hinder); // Placera hinder i mitten av scenen obstacles.x = stage.stageWidth / 2; hinder.y = stadium.stageHeight / 2;  // Projekt en laser från lasergeneratorenhetens offentliga funktion ProjectLaser (): void laser = new Sprite (); addChild (laser); // Ange laserens ursprung som laserpistolens centrum startX = laserGun.x; startY = laserGun.y; // Ange slutpunkten för laserändenX = startX + 230; endy = startY; // Rita laser laser.graphics.lineStyle (1, 0xFF0000); laser.graphics.moveTo (startX, startY); laser.graphics.lineTo (endX, endY); 

Testa filmen.

Raketten är precis där uppe i himlen. Laserskyddet har startat projektionen av lasern. Hur hände det? Låt oss försöka förstå ovanstående kod i nästa steg.


Steg 12: Hur är laserprojektet?

I ovanstående steg projicerade vi framgångsrikt en laser. Därför utförde vi följande uppgifter:

Först förklarade vi fem nya variabler:

 var laser: Sprite; var startX: Number; // x startpunkten för laser var startY: Nummer; // y utgångspunkten för laser var endX: Number; // x slutpunkten för laser var än: Nummer; // y slutpunkten för laser

För det andra lade vi till en ny metod ProjectLaser ():

 offentlig funktion ProjectLaser (): void laser = new Sprite (); addChild (laser); // Ange laserens ursprung som laserpistolens centrum startX = laserGun.x; startY = laserGun.y; // Ange slutpunkten för laserändenX = startX + 230; endy = startY; // Rita laser laser.graphics.lineStyle (1, 0xFF0000); laser.graphics.moveTo (startX, startY); laser.graphics.lineTo (endX, endY); 

Steg 13: Förståelse ProjectLaser () Metod

I ovanstående metod skapade vi först ett tomt Sprite-objekt för att hålla lasern och lade den till scenen enligt nedan:

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

Eftersom vi ville att lasern skulle börja projicera från laserpistolen, tilldelar vi laserpistolens X-värde till startx och Y värde till startY enligt nedanstående:

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

(Senare gav vi dessa värden till moveTo (startX, startY) metod som vi kommer att träffas snart.)

Då definierade vi endX och Endy:

 endX = startX + 230; endy = startY;

Värden som tilldelas ovanstående variabler är temporära värden. Vi använde dem bara för att visa den grundläggande projektionen av en laser. I kommande steg ska vi modifiera dessa värden genom att tillämpa enkel matematik. Dessa värden är nyckeln till att göra perfekt träffdetektering av lasern. Vi ska studera dem senare i denna session.

Och nu den viktiga delen av denna metod. Ritning av en rak linje inom laserspritobjektet för att efterlikna den projicerade lasern.

Först hanterade vi stilen på linjen som ska ritas enligt nedan:

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

Denna lineStyle () -metod används för att styra stylingen av strecket i ritningsobjektet, såsom linje, rektangel, oval etc. Du kan ge maximalt åtta argument till den här metoden. Om inte specificerat anges standardvärden istället. För vårt exempel behöver vi bara två argument. Det första argumentet är linjets tjocklek (dvs 1) och det andra argumentet är färgen på linjen (dvs.. 0xFF0000, vilket är rött).

För en detaljerad förklaring av denna metod, kolla in Adobe Help doc på "lineStyle (args?)" -Metoden.

Sedan lade vi utgångspunkten för linjen enligt nedan:

 laser.graphics.moveTo (startX, startY);

startx och startY säkerställer att utgångspunkten måste vara centrum för laserpistolen.

Därefter finsihed vi upp linjen:

 laser.graphics.lineTo (endX, endY);

Kom ihåg att dessa endX och endy är tillfälliga värden bara för att visa projektionen. Vi behöver dem att få justeras om något hinder kommer i vägen för laser. Vi ska göra den matematiken i kommande steg.

Så vi ritade en rad från (startx, startY) till (endX, Endy).

Raketten går och går. Se dessa landskap, vattendrag?

Nu är det dags för den verkliga åtgärden. Hit upptäckt med hinder.


Steg 14: Hitdetektion med hinder

Nu är vi utrustade med en laserpistol. Vi har också flera hinder. Vi är på den nivå där vi kan lägga till träffdetektering som säkert kommer att lägga till meningen med scenen.

Du kanske tror att denna mycket noggranna träffdetektering kräver komplicerad matte. Om så är fallet är du fel. Den använder helt enkelt den inbyggda metoden för ActionScript i hitTestPoint () tillsammans med en för slinga. Den komplexa matematiken bakom perfekt träffdetektering hanteras med denna metod. Du behöver bara använda denna metod och a för loop på ett smart sätt.

Vi kommer att göra några viktiga förändringar i vår dokumentklass huvudsakligen till ProjectLaser () metod och lite ny vars, så observera och tillämpa den noggrant. Låt oss ändra det enligt följande:

Lägg först till dessa nya vars:

 var rad: Number = Math.PI / 180; // Används för att beräkna vinkel i radianer var maxDist: Number = 250; // Maximal avstånd som ska reste av lasern var justeradDist: Nummer; // nytt maximalt avstånd om något hinder kommer på ett sätt

Ändra sedan ProjectLaser () metod genom att lägga till för loop som visas nedan (notera också det nu endX och Endy är inuti för slinga):

 // Projekt en laser från lasergeneratorenhetens offentliga funktion ProjectLaser (): void laser = new Sprite (); addChild (laser); // Ange laserens ursprung som laserpistolens centrum startX = laserGun.x; startY = laserGun.y; för (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 ); 

Testa filmen.

Bom? Jag är säker. Titta på denna effekt är du inspirerad till att skapa en Flash-spel som har säkerhetsintelligens. Perfekt AI, för att utveckla intressant spel i Flash.


Steg 15: Hur Hit Detection Händde

Först och främst lade vi till ny vars till vår dokumentklass enligt följande:

Ursprungligen en vinkel, i radianer

 var rad: Number = Math.PI / 180; // Används för att beräkna vinkel i radianer

Ovanstående var används i formel för att beräkna en vinkel i radianer.

Formeln är, radianer = grader * Math.PI / 180. Mer info här. Vi använde denna formel i vår kod, enligt följande:

 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, och rad = Math.PI / 180.

För det andra skapade vi en var för det maximala avstånd som ska reste av lasern:

 var maxDist: Nummer = 250; // maximalt avstånd som ska räckas av lasern

Detta bestämmer det maximala avstånd som ska räckas av lasern. Eftersom det inte är nödvändigt att dra laser utanför synligt område definierar vi en fin slutpunkt. Detta var kommer att göra vad som behövs.

För det tredje har vi ett var för laserens nuvarande avstånd vid korsning med något hinder.

 var justeradDist: Nummer; // nytt maximalt avstånd om något hinder kommer på ett sätt

När något hinder kommer i vägen för laser, är lasern blockerad snarare än att åka till maximal avstånd.

Avståndet efter att ha blivit en laser är inget annat än det justerade avståndet beroende på situationen.

De för loop och hitTestPoint () varje spelar en viktig roll vid beräkningen av detta avstånd.

Fjärde, vi modifierade ProjectLaser () metod genom att lägga till ActionScript hitTestPoint () tillsammans med a för slinga. Vi tilldelade oss endX och Endy variabler.

 för (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;  

Slingan säkerställer att det justerade avståndet ökas upp till maximal avstånd. Du kanske tänker "Vad är det roligt att göra anpassat avstånd lika med maximalt avstånd?"

Egentligen tillåter detta justerade avstånd att matcha det maximala avståndet naturligt men så snart det träffar några hinder (vilket detekteras av hitTestPoint () metod) är detta avstånd markerat som maximal avstånd för den aktuella situationen. Tack vare hitTestPoint () för att göra uppgiften så enkel.

Vi har också omfördelats endX och Endy värden som:

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

Trigonometriet fungerar Math.cos () och Math.sin () används för att beräkna vinkeln på laser w.r.t laserpistolrotation.

I enkel form, det tar hand om att rikta laser där laserpistolen ser ut. Det är viktigt att laserpistol och laser båda synkroniseras. Så snart laserpistolen är roterad kommer lasern att följa rotationen.

För mer information om trigonometri, läs denna Snabba Tips.

Slutligen scenens klimax:

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

hitTestPoint () Metoden tar tre parametrar, varav den första och andra parametern är nödvändiga och den tredje (shapeflag) kommer att lämnas som standard (dvs.. falsk) om det inte anges.

I vårt exempel, shapeflag är satt till Sann eftersom vi vill träffa detektering med hänsyn till den exakta formen av målobjektet (dvs.. hinder). Om detta värde är inställt på falsk träffdetektering sker med hänsyn till det objektets avgränsningslåda och inte den exakta formen.

De första och andra parametrarna för hitTestPoint () definiera en punkt (x, y) vid vilken du ska kontrollera skärningspunkten med visningsobjektet. I vårat fall hinder är det visningsobjektet och endX och Endy representerar skärningspunkten på scenen.

Oklar? Höger. För att förenkla ska vi lägga logiken i följd enligt följande:

  1. De för slingan gör det möjligt för laserprojektionen att fortsätta (genom att uppdatera endX och Endy) om inom maximalt avstånd.
  2. hitTestPoint () väntar på att bryta för slingan så snart den ser korsningen. När för slingan är trasig, endX och Endy är frysta.
  3. Slutligen dessa frusna endX och Endy skickas till Graphics.lineTo () metod.

Steg 16: Applicera rotation till laserpistol

För att lägga till rotation till laserpistol måste vi utföra några större förändringar:

  1. Omstrukturering ProjectLaser () metod.
  2. Placerar hela träffdetekteringslogiken i ny metod HitTest ().
  3. Lägger till ett nytt uttalande laser.graphics.clear () i för slinga.
  4. Import uttalande importera flash.events.Event

Först ska vi omstrukturera ProjectLaser () metod genom att flytta hela träffdetekteringslogiken i ny metod HitTest ().

Då ska vi lägga till laser.graphics.clear () uttalande innan laser.graphics.lineStyle (1, 0xFF0000) uttalande inuti för loop av ny metod HitTest (). Detta kommer att ta bort laserens gamla projektion från scenen när laserpistolen börjar rotera.

Låt oss se hur det kommer att se efter att ha gjort alla fyra stora förändringarna:

 offentlig funktion ProjectLaser (): void laser = new Sprite (); addChild (laser); // Ange laserens ursprung som laserpistolens centrum startX = laserGun.x; startY = laserGun.y;  // Hit-test, offentlig funktion 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 kanske frågar varför vi gjorde sådana stora förändringar? Den enda anledningen är ENTER_FRAME händelse.

För att tillämpa kontinuerlig rotation ska vi lägga till en ny metod, LaserGunRotation (evt: Event) som aktiveras av ENTER_FRAME händelse (vilket betyder att den körs 24 gånger i sekundet, eftersom vår bildhastighet är 24 bilder / s). När den här händelsen används måste du vara försiktig med att bara lägga till sådana egenskaper som vi vill ändra över tiden. Undvik att sätta in de värden som förblir konstanta under genomförandet.

I vårt fall, om du observerar gammal ProjectLaser () metod har den:

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

Tänk om du lägger till ovanstående uttalanden i en metod som använder ENTER_FRAME händelse; då skulle ett nytt Laser Sprite-objekt skapas och läggas till steg flera gånger - 24 gånger per sekund.

Detta är absolut onödigt. Därför omstrukturerades vi ProjectLaser () metod och tillsatt ny metod HitTest (). Du kan byta namn ProjectLaser () metod till InitializeLaser () eftersom det inte längre projekterar lasern. Nu skapar den bara den tomma hållaren för lasern och definierar utgångspunkten. Projektionen hanteras i en ny metod, HitTest ().

Låt oss nu se den nya metoden LaserGunRotation (evt: Event). Innan det lägger du till följande importdeklaration i början av dokumentklassen:

 importera flash.events.Event;

Och lägg till följande metod:

 // Rotera laserpistolens offentliga funktion LaserGunRotation (evt: Event): void laserGun.rotation + = 0.5; HitTest (); 

Glöm inte att ringa den här metoden med en ENTER_FRAME händelse inom konstruktörfunktionen som visas nedan:

 // Konstruktörens offentliga funktion Laser_HitDetection () CreateLaserGun (); CreateObstacles (); ProjectLaser (); addEventListener (Event.ENTER_FRAME, LaserGunRotation); 

Detta ställer upp det för att köra LaserGunRotation () funktion 24 gånger i sekund.

Testa filmen.

Raketten har redan trängt in i molnen. Se den vackra jorden.


Steg 17: Tillägg av kontroll till noggrannhet av träffdetektering

I det här steget ska vi lägga till en kontroll för att justera noggrannheten för träffdetektering. Detta är viktigt eftersom du inte behöver den exakta träffdetektering varje gång; du kanske behöver en genomsnittlig nivå av träffdetektering. Detta kommer också att bidra till att minska CPU-konsumtionen vid tidpunktsdetektering.

Vi ska introducera en ny variabel tolerans som:

 var tolerans: Antal = 1;

Då ska vi modifiera för slingans inkrement uttalande som:

 för (adjustedDist = 0; adjustedDist < maxDist; adjustedDist += tolerance)

Nu ser förbandet ut:

 för (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;  

Det innebär att vi istället för att kolla efter en kollision vid varje pixel av laserlinjen kontrollerar en kollision vid varje annan pixel eller var tredje pixel etc.

Att sänka värdet för "tolerans" ökar noggrannheten i träffdetektering men kräver mer CPU-effekt. Försök experimentera med olika värden för "tolerans".

Vänner, det är dags att lämna raketen och öppna fallskärmen. Markera säkert på marken och börja använda ovanstående teknik i dina Flash-spel och applikationer. Njut av!


Slutsats:

I denna handledning såg vi främst det perfekta utnyttjandet av hitTestPoint () och a för loop för att skapa exakt träffdetektering utan att använda någon komplex matte.

Denna effekt kan användas i ett säkerhetstypspel där kameror och laserpistoler krävs.