Lasergenerator, obstakels en nauwkeurige treindetectie

Dag vrienden. Het hoogtepunt van deze zelfstudie is accuraat tref detectie van een gegenereerde laser. Dit soort AI is handig bij het maken van actiegames, vooral in het geval van beveiligingsintelligentie met camera's, lasergeweren enz. Dus zet je raket op je rug, het aftellen begint?


Eindresultaat voorbeeld

Laten we eens kijken naar het eindresultaat waar we naartoe zullen werken:


Stap 1: Flash-bestand voorbereiden

Open Flash en maak een nieuw Flash-document (ActionScript 3.0).

Stel de stage in op elke standaardresolutie. Mijn is 500 x 350 px.

Stel framesnelheid in op 24 fps.

Bewaar het bestand in een map naar keuze.


Stap 2: Lasergeneratorapparaat maken

Laten we nu een lasergenerator maken.

Teken een cirkel met straal 20, d.w.z. 40 x 40. Vul deze ook met een mooie radiale kleurovergang.

Nu moeten we deze cirkel omzetten in een Flash-symbool, zodat we het met ActionScript kunnen besturen.

Selecteer de cirkel en druk op F8 of ga naar Wijzig> Converteren naar symbool. Selecteer Filmclip voor het symbooltype. Stel het registratiepunt ook in op het midden zodat de lasergenerator vanuit het midden roteert. Type laserGenerator_MC in name name field en dan last but not least "Exporteer voor ActionScript" in de "Advanced" -groep, zodat we toegang hebben tot de lasergenerator uit onze documentklasse die we binnenkort zullen ontmoeten.

Nadat u alle bovenstaande opties hebt ingesteld, drukt u op OK. Druk opnieuw op OK voor het dialoogvenster met de waarschuwing voor klassedefinitie. Hiermee wordt een klassedefinitie gemaakt voor de lasergegenereerde generator tijdens runtime.

Nu hebben we het niet nodig laserGenerator_MC symbool op het werkgebied omdat het beschikbaar is in het deelvenster Bibliotheek met id-naam laserGenerator_MC. Verwijder dit symbool daarom uit het werkgebied. Je podium zou nu leeg moeten zijn.


Stap 3: Het uiterlijk van de lasergenerator verbeteren

Nu zullen we een mond aan deze generator toevoegen om een ​​gevoel van een apparaat te creëren. Dubbelklik in het bibliotheekpaneel op laserGenerator_MC symboolpictogram (linkerkant van de symboolnaam) om naar de bewerkingsmodus te gaan. Voeg er mond aan toe zoals hieronder getoond.

Voel je vrij om je eigen ontwerp toe te voegen.

Notitie: Verander de positie van de cirkel niet, omdat we hem in het midden moeten draaien.

Nadat u een mond aan de generator hebt toegevoegd, verlaat u de symboolbewerkingsmodus en keert u terug naar de hoofdtijdlijn.

Je raket heeft de grond verlaten. Het lasergeneratorapparaat staat klaar om te presteren.


Stap 4: Documentklasse voorbereiden

Om een ​​drama aan onze scene toe te voegen hebben we ActionScript nodig. Om slim te handelen, hebben we documentklasse nodig.

In deze stap zullen we een basisstructuur van onze documentklasse creëren.

Raadpleeg deze snelle tip voor een gedetailleerde uitleg over de documentklasse.

Dus maak een nieuw ActionScript 3.0-bestand. Typ de volgende code:

 pakket public class Laser_HitDetection public function Laser_HitDetection () // constructorcode

Sla deze documentklasse op als Laser_HitDetection.as in dezelfde map waarin u uw FLA voor deze zelfstudie hebt opgeslagen. Leuke start. Uw standaard documentklasse is klaar.


Stap 5: Documentklasse aan FLA koppelen

Open in uw FLA-bestand het paneel Eigenschappen voor het document en typ de naam van de klasse in het veld Documentklasse die beschikbaar is onder de groep "Publiceren".

Nu zijn we klaar om hiermee te communiceren met FLA Laser_HitDetection.as documentklasse.


Stap 6: Plaats en lijn de lasergenerator uit in Stage Center

We zullen een instantie van een lasergenerator uit de bibliotheek maken en deze in het midden van het werkgebied plaatsen.

Wijzig de Laser_HitDetection.as documentklasse zoals hieronder getoond (gemarkeerde lijnen):

 pakket import flash.display.Sprite; public class Laser_HitDetection breidt Sprite uit var laserGun: Sprite; // Instantie van laserGenerator_MC // Constructor publieke functie Laser_HitDetection () CreateLaserGun ();  // Generator van de openbare bibliotheek ophalen en plaatsen CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Haal het uit de library addChild (laserGun); // Plaats de lasergenerator in het midden van de stage laserGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2; 

Als je de film nu test, zie je ons laserwapen netjes in het midden van het podium staan.


Stap 7: Begrijpen CreateLaserGun () methode

In de bovenstaande code die we hebben gebruikt sprite klasse om een ​​instantie van het Sprite-object te maken die de laser kan bevatten. Daarvoor verklaren we variabele als:

 var laserGun: Sprite;

Toen hebben we een nieuwe methode toegevoegd "CreateLaserGun ()"waarin we een instantie hebben toegewezen van laserGenerator_MC van de bibliotheek tot het bovenstaande Laser geweer var als:

 laserGun = nieuwe laserGenerator_MC ();

Nadat we het aan het podium hadden toegevoegd, plaatsten we het in het midden van het podium als:

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

Uiteindelijk noemden we deze methode van de constructormethode van de documentklasse als:

 // Constructor public function Laser_HitDetection () CreateLaserGun (); 

Raket versnelt met volledige stuwkracht. We zullen dit laserpistool zeer snel activeren, wat de laser zal projecteren. Daarvoor zullen we een aantal obstakels toevoegen. Laten we gaan.


Stap 8: Obstakels met verschillende vormen toevoegen

Om te experimenteren met hitdetectie, moeten we enkele obstakels op het podium zetten. Teken op het podium verschillende vormen die lijken op convex-concave oppervlakken, hellingsklimmen en rechte randen, zoals hieronder weergegeven:


Stap 9: Alle hindernissen omzetten in één filmclip

Nu zullen we al deze vormen in één symbool plaatsen. Selecteer alle vormen tegelijk en druk op F8 of ga naar Wijzig> Converteren naar symbool. Selecteer Filmclip als symbooltype. Geef dit symbool een naam obstacles_MC in naamtekstveld. Stel het registratiepunt in het midden in. Vink ook "Exporteren voor ActionScript" aan zodat we er toegang toe hebben vanuit onze documentklasse.

Na het converteren naar MovieClip hebben we obstacles_MC in de bibliotheek met dezelfde identificatienaam. Simlilary als laserGenerator_MC we hebben dit symbool niet nodig op het podium, dus verwijder het van het podium. Nu is je podium leeg.


Stap 10: plaats het hindernissen-symbool in het Stage Center en lijn het uit

De manier waarop we onze plaatsen laserGenerator_MC op het podium, in het midden, op dezelfde manier zullen we plaatsen obstacles_MC symbool op het podium. Wijzig de documentklasse zoals hieronder getoond:

 pakket import flash.display.Sprite; public class Laser_HitDetection breidt Sprite uit var laserGun: Sprite; // Instantie van laserGenerator_MC var obstakels: Sprite; // Instantie van obstakels_MC // Constructor publieke functie Laser_HitDetection () CreateLaserGun (); CreateObstacles ();  // Generator van de openbare bibliotheek ophalen en plaatsen CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Haal het uit de library addChild (laserGun); // Plaats de lasergenerator in het midden van de stage laserGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2;  // Obstakels uit de openbare bibliotheek halen en plaatsen CreateObstacles (): void obstakels = nieuwe obstakels_MC (); // Haal het uit de library addChild (obstakels); // Plaats obstakels in het midden van de hindernissen van het podium .x = stage.stageWidth / 2; obstacles.y = stage.stageHeight / 2; 

Test de film om obstakels rond het laserpistool te zien.

Je raket raakt de eindsnelheid. Nu is het tijd om het laserpistool te activeren. Het moet de laser ervan genereren. Laten we dat nu doen.


Stap 11: Laser projecteren

Hoe kunnen we de laser nabootsen? Enig idee?? Hoe zit het met het gebruik van sommige leden van de grafische klasse zoals lineStyle (), moveTo (), lineTo (). Als u bekend bent met deze methoden, dan is uw taak eenvoudig. Voor degenen die deze methoden niet kennen, zijn we altijd bij je. Laten we ze in detail bekijken.

We zullen een nieuwe methode toevoegen ProjectLaser (). Laten we onze wijzigen Laser_HitDetection documentklasse zoals hieronder getoond:

 // Constructorpakket import flash.display.Sprite; public class Laser_HitDetection breidt Sprite uit var laserGun: Sprite; // Instantie van laserGenerator_MC var obstakels: Sprite; // aanleg van obstakels_MC var laser: Sprite; var startX: Number; // x startpunt van laser var startY: Number; // y startpunt van laser var endX: Number; // x eindpunt van laser var endY: Number; // y eindpunt van laser // Constructor public function Laser_HitDetection () CreateLaserGun (); CreateObstacles (); ProjectLaser ();  // Generator van de openbare bibliotheek ophalen en plaatsen CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Haal het uit de library addChild (laserGun); // Plaats de lasergenerator in het midden van de stage laserGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2;  // Obstakels uit de openbare bibliotheek halen en plaatsen CreateObstacles (): void obstakels = nieuwe obstakels_MC (); // Haal het uit de library addChild (obstakels); // Plaats obstakels in het midden van de hindernissen van het podium .x = stage.stageWidth / 2; obstacles.y = stage.stageHeight / 2;  // Projecteer een laser vanuit de openbare inrichting van de lasergenerator. ProjectLaser (): void laser = new Sprite (); addChild (laser); // Stel de oorsprong van de laser in als het midden van het laserpistool startX = laserGun.x; startY = laserGun.y; // Stel het eindpunt van de laser endX = startX + 230 in; endY = startY; // Teken laser laser.graphics.lineStyle (1, 0xFF0000); laser.graphics.moveTo (startX, startY); laser.graphics.lineTo (endX, endY); 

Test de film.

De raket is precies daar in de lucht. Het laserpistool is begonnen met het projecteren van de laser. Hoe is dat gebeurt? Laten we de bovenstaande code proberen te begrijpen in de volgende stap.


Stap 12: Hoe wordt de laser geprojecteerd?

In de bovenstaande stap hebben we met succes een laser geprojecteerd. Hiervoor hebben we de volgende taken uitgevoerd:

Eerst hebben we vijf nieuwe variabelen verklaard:

 var laser: Sprite; var startX: Number; // x startpunt van laser var startY: Number; // y startpunt van laser var endX: Number; // x eindpunt van laser var endY: Number; // y eindpunt van laser

Ten tweede hebben we een nieuwe methode toegevoegd ProjectLaser ():

 public function ProjectLaser (): void laser = new Sprite (); addChild (laser); // Stel de oorsprong van de laser in als het midden van het laserpistool startX = laserGun.x; startY = laserGun.y; // Stel het eindpunt van de laser endX = startX + 230 in; endY = startY; // Teken laser laser.graphics.lineStyle (1, 0xFF0000); laser.graphics.moveTo (startX, startY); laser.graphics.lineTo (endX, endY); 

Stap 13: Begrijpen ProjectLaser () Methode

In de bovenstaande methode hebben we eerst een leeg Sprite-object gemaakt om de laser vast te houden en deze ook aan het podium toegevoegd, zoals hieronder wordt weergegeven:

 laser = nieuwe Sprite (); addChild (laser);

Omdat we wilden dat de laser vanuit het laserpistool zou gaan projecteren, kennen we de X-waarde van laserpistool toe aan startX en Y-waarde voor starty zoals hieronder getoond:

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

(Later hebben we deze waarden aan de moveTo (startX, startY) methode die we binnenkort zullen ontmoeten.)

Toen hebben we gedefinieerd eindeX en Endy:

 endX = startX + 230; endY = startY;

Waarden toegewezen aan bovenstaande variabelen zijn tijdelijke waarden. We gebruikten ze alleen om de basale projectie van een laser te tonen. In komende stappen zullen we deze waarden wijzigen door enkele eenvoudige wiskunde toe te passen. Deze waarden zijn essentieel voor het maken van een perfecte hitdetectie van de laser. We zullen ze later in deze sessie bestuderen.

En nu het belangrijke deel van deze methode. Een rechte lijn tekenen binnen laser-sprite-object om de geprojecteerde laser na te bootsen.

Eerst hebben we de stijl van de te tekenen lijn behandeld zoals hieronder getoond:

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

Deze lineStyle () -methode wordt gebruikt om de stijl van de lijn van het tekenobject te regelen, zoals lijn, rechthoek, ovaal, enzovoort. U kunt maximaal acht argumenten aan deze methode geven. Als er in plaats daarvan geen opgegeven standaardwaarden worden toegewezen. Voor ons voorbeeld hebben we slechts twee argumenten nodig. Het eerste argument is de dikte van de lijn (d.w.z. 1) en het tweede argument is de kleur van de lijn (d.w.z.. 0xFF0000, welke is rood).

Raadpleeg voor gedetailleerde uitleg van deze methode het Adobe-helpdocument op de "lineStyle (args?)" -Methode.

Vervolgens plaatsten we het startpunt van de lijn zoals hieronder getoond:

 laser.graphics.moveTo (startX, startY);

startX en starty zorgt ervoor dat het startpunt het centrum van het laserpistool moet zijn.

Daarna vingen we de grens op:

 laser.graphics.lineTo (endX, endY);

Vergeet niet dat deze endX en endY tijdelijke waarden zijn om de projectie te tonen. We hebben ze nodig om aangepast te worden als er een obstakel in de weg staat van laser. We zullen die wiskunde in komende stappen doen.

Dus, we hebben een streep getrokken van (startX, starty) naar (eindeX, Endy).

De raket gaat en gaat. Zie die landschappen, waterlandschappen?

Nu is het tijd voor de echte actie. Sla detectie met obstakels.


Stap 14: Hitdetectie met obstakels

Nu zijn we uitgerust met een laserpistool. We hebben ook verschillende obstakels. We bevinden ons op het niveau waarop we hitdetectie kunnen toevoegen, wat zeker de betekenis aan de scène zal toevoegen.

U denkt misschien dat deze zeer nauwkeurige hitdetectie complexe wiskunde vereist. Als dat zo is, dan heb je het mis. Het gebruikt gewoon de met hitTestPoint () ingebouwde methode van ActionScript samen met een voor lus. De complexe wiskunde achter perfecte hitdetectie wordt behandeld door deze methode. U hoeft alleen deze methode te gebruiken en a voor loop op een slimme manier.

We gaan enkele belangrijke wijzigingen in onze documentklasse aanbrengen, voornamelijk aan ProjectLaser () methode en enkele nieuwe vars, dus observeer en pas het zorgvuldig toe. Laten we het aanpassen zoals getoond:

Voeg eerst deze nieuwe vars toe:

 var rad: Number = Math.PI / 180; // Gebruikt om de hoek in radialen te berekenen var maxDist: Number = 250; // maximale af te leggen afstand door de laser var adjustedDist: Number; // nieuwe maximale afstand als een obstakel op een manier komt

Pas dan aan ProjectLaser () methode door toe te voegen voor loop zoals hieronder weergegeven (houd er ook rekening mee dat dit nu gebeurt eindeX en Endy zijn binnen voor lus):

 // Projecteer een laser van de openbare projectorfunctie van de lasergenerator ProjectLaser (): void laser = new Sprite (); addChild (laser); // Stel de oorsprong van de laser in als het midden van het laserpistool 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 de film.

Boom? Ik ben er zeker van. Als je naar dit effect kijkt, word je geïnspireerd om een ​​Flash Game te maken met beveiligingsintelligentie. Perfecte AI, om een ​​interessant spel in Flash te ontwikkelen.


Stap 15: Hoe de Hit Detection Happened

Allereerst hebben we nieuwe vars aan onze documentklasse toegevoegd, zoals te zien is:

Aanvankelijk een hoek, in radialen

 var rad: Number = Math.PI / 180; // Gebruikt om de hoek in radialen te berekenen

De bovenstaande var wordt gebruikt in de formule om een ​​hoek in radialen te berekenen.

De formule is, radialen = graden * Math.PI / 180. Meer informatie hier. We gebruikten deze formule in onze code, in deze regels:

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

In laserGun.rotation * rad, graden = laserGun.rotation, en rad = Math.PI / 180.

Ten tweede hebben we een var gemaakt voor de maximale afstand die de laser moet afleggen:

 var maxDist: Number = 250; // maximale afstand die de laser moet afleggen

Deze var bepaalt de maximale afstand die de laser moet afleggen. Omdat het niet nodig is om een ​​laser buiten het zichtbare gebied te tekenen, definiëren we een mooi eindpunt. Deze var zal doen wat nodig is.

Ten derde hebben we een var voor de huidige afstand van de laser op het moment van kruising met een obstakel.

 var adjustedDist: Number; // nieuwe maximale afstand als een obstakel op een manier komt

Wanneer een obstakel laserwerking verhindert, wordt de laser geblokkeerd in plaats van te reizen naar de maximale afstand.

De afstand na het blokkeren van een laser is niets anders dan de ingestelde afstand, afhankelijk van de situatie.

De voor loop en hitTestPoint () elk speelt een belangrijke rol bij het berekenen van deze afstand.

Ten vierde hebben we ons aangepast ProjectLaser () methode door ActionScript's toe te voegen hitTestPoint () samen met een voor lus. We hebben opnieuw toegewezen eindeX en Endy variabelen.

 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;  

De for-lus zorgt ervoor dat de aangepaste afstand wordt verhoogd tot de maximale afstand. Je denkt misschien: "Wat is het leuk om een ​​aangepaste afstand te maken die gelijk is aan de maximale afstand?"

Eigenlijk mag deze aangepaste afstand overeenkomen met de maximale afstand natuurlijk, maar zodra deze obstakels raakt (die wordt gedetecteerd door hitTestPoint () methode) deze afstand is gemarkeerd als maximale afstand voor die huidige situatie. Dankzij hitTestPoint () om de taak zo eenvoudig te maken.

We hebben ook opnieuw toegewezen eindeX en Endy waarden als:

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

De trigonometriefuncties Math.cos () en Math.sin () worden gebruikt om de hoek van laserw.r.t laserpistoolrotatie te berekenen.

In eenvoudige vorm zorgt het voor het richten van de laser op het laserwapen. Het is belangrijk dat het laserpistool en de laser beide synchroon lopen. Dus wanneer het laserpistool wordt geroteerd, volgt de laser de rotatie.

Lees deze snelle tip voor meer informatie over trigonometrie.

Eindelijk het hoogtepunt van de scène:

 if (obstacles.hitTestPoint (endX, endY, true)) break; 

hitTestPoint () methode neemt drie parameters, waarvan de eerste en tweede parameters nodig zijn en de derde (shapeFlag) zal worden achtergelaten als de standaard (d.w.z.. vals) indien niet gespecificeerd.

In ons voorbeeld, shapeFlag ingesteld op waar omdat we hitdetectie willen met betrekking tot de exacte vorm van het doelobject (d.w.z.. obstakels). Als deze waarde is ingesteld op vals de hitdetectie gebeurt met betrekking tot de begrenzingsdoos van dat object en niet de exacte vorm.

De eerste en tweede parameters van hitTestPoint () definieer een punt (x, y) waarop gecontroleerd moet worden op kruisingen met het weergaveobject. In ons geval obstakels is dat weergaveobject, en eindeX en Endy vertegenwoordigt het punt van kruising op het podium.

Onduidelijk? Rechts. Ter vereenvoudiging zullen we de logica als volgt in volgorde plaatsen:

  1. De voor loop maakt het mogelijk de projectie van de laser voort te zetten (door bij te werken eindeX en Endy) indien binnen maximale afstand.
  2. hitTestPoint () wacht om de te breken voor loop zodra het de kruising ziet. Zodra de voor lus is verbroken, eindeX en Endy zijn bevroren.
  3. Eindelijk zijn deze bevroren eindeX en Endy worden doorgegeven aan de Graphics.lineTo () methode.

Stap 16: Rotatie op laserpistool toepassen

Om rotatie toe te voegen aan laserpistool, moeten we enkele belangrijke wijzigingen aanbrengen:

  1. Re-Structuring ProjectLaser () methode.
  2. De hele hitdetectielogica in een nieuwe methode plaatsen HitTest ().
  3. Nieuwe verklaring toevoegen laser.graphics.clear () in de voor lus.
  4. Importeer verklaring import flash.events.Event

Eerst zullen we het ProjectLaser () methode door de hele hitdetectielogica in de nieuwe methode te verplaatsen HitTest ().

Dan zullen we toevoegen laser.graphics.clear () verklaring vóór laser.graphics.lineStyle (1, 0xFF0000) verklaring binnen de voor loop van de nieuwe methode HitTest (). Hiermee wordt de oude projectie van de laser verwijderd uit het stadium waarin het laserpistool begint te draaien.

Laten we eens kijken hoe het eruit zal zien nadat we alle vier belangrijke wijzigingen hebben doorgevoerd:

 public function ProjectLaser (): void laser = new Sprite (); addChild (laser); // Stel de oorsprong van de laser in als het midden van het laserpistool startX = laserGun.x; startY = laserGun.y;  // Hit test publieke functie 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 ); 

Je vraagt ​​je misschien af ​​waarom we zulke grote veranderingen hebben doorgevoerd? De enige reden is ENTER_FRAME evenement.

Om continue rotatie toe te passen, zullen we een nieuwe methode toevoegen, LaserGunRotation (evt: evenement) welke wordt geactiveerd door ENTER_FRAME evenement (wat betekent dat het 24 keer per seconde wordt uitgevoerd, aangezien onze framesnelheid 24 fps is). Wanneer deze gebeurtenis wordt gebruikt, moet u erop letten dat u alleen die eigenschappen toevoegt die we in de loop van de tijd willen wijzigen. Vermijd het invoeren van die waarden die tijdens de uitvoering constant blijven.

In ons geval, als je oud waarneemt ProjectLaser () methode, het heeft:

 laser = nieuwe Sprite (); addChild (laser); // Draai het laserspistool

Stel je voor dat je bovenstaande beweringen toevoegt in een methode die gebruikt ENTER_FRAME evenement; vervolgens zou een nieuw laser-Sprite-object worden gemaakt en herhaaldelijk aan het werkgebied worden toegevoegd - 24 keer per seconde.

Dit is absoluut niet nodig. Daarom hebben we een herstructurering doorgevoerd ProjectLaser () methode en nieuwe methode toegevoegd HitTest (). Je kunt de naam wijzigen ProjectLaser () methode om InitializeLaser () omdat het niet langer de laser projecteert. Nu wordt alleen de lege houder voor de laser gemaakt en wordt het beginpunt bepaald. De projectie wordt verwerkt in een nieuwe methode, HitTest ().

Laten we nu de nieuwe methode bekijken LaserGunRotation (evt: evenement). Voeg daarvoor de volgende importinstructie toe aan het begin van de documentklasse:

 import flash.events.Event;

En voeg de volgende methode toe:

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

Vergeet ook niet om deze methode te bellen met een ENTER_FRAME evenement binnen constructorfunctie zoals hieronder getoond:

 // Constructor public function Laser_HitDetection () CreateLaserGun (); CreateObstacles (); ProjectLaser (); addEventListener (Event.ENTER_FRAME, LaserGunRotation); 

Hiermee wordt het instellen van de LaserGunRotation () functioneer 24 keer per seconde.

Test de film.

De raket is al in wolken doorgedrongen. Zie de prachtige aarde.


Stap 17: Controle toevoegen aan de nauwkeurigheid van Hit Detection

In deze stap zullen we een controle toevoegen om de nauwkeurigheid van de hitdetectie aan te passen. Dit is belangrijk omdat u niet elke keer de precieze hitdetectie nodig hebt; misschien heb je een gemiddeld niveau van hitherkenning nodig. Dit helpt ook bij het verminderen van het CPU-verbruik ten tijde van de detectie van een hit.

We zullen een nieuwe variabele introduceren tolerantie zoals:

 var tolerance: Number = 1;

Dan zullen we de voor loop's increment statement als:

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

Nu zal de for-lus er als volgt uitzien:

 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;  

Dit betekent dat in plaats van te controleren op een botsing bij elke pixel van de laserlijn, we alleen controleren op een botsing bij elke andere pixel, of elke derde pixel, enz..

Het verlagen van de waarde voor "tolerantie" zal de nauwkeurigheid van de hitdetectie verhogen, maar vereist meer CPU-kracht. Probeer te experimenteren met verschillende waarden voor "tolerantie".

Vrienden, het is tijd om de raket te verlaten en de parachute te openen. Land veilig op de grond en gebruik de bovenstaande techniek in je Flash-games en -toepassingen. Genieten!


Conclusie:

In deze tutorial zagen we vooral het perfecte gebruik van hitTestPoint () en een voor loop om nauwkeurige hitdetectie te maken zonder complexe wiskunde te gebruiken.

Dit effect kan worden gebruikt in een actiegame van het beveiligingstype waarbij camera's en laserpistolen vereist zijn.