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?
Laten we eens kijken naar het eindresultaat waar we naartoe zullen werken:
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.
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.
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.
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.
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.
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.
CreateLaserGun ()
methodeIn 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.
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:
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.
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.
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.
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);
ProjectLaser ()
MethodeIn 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.
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.
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:
voor
loop maakt het mogelijk de projectie van de laser voort te zetten (door bij te werken eindeX
en Endy
) indien binnen maximale afstand.hitTestPoint ()
wacht om de te breken voor
loop zodra het de kruising ziet. Zodra de voor
lus is verbroken, eindeX
en Endy
zijn bevroren.eindeX
en Endy
worden doorgegeven aan de Graphics.lineTo ()
methode.Om rotatie toe te voegen aan laserpistool, moeten we enkele belangrijke wijzigingen aanbrengen:
ProjectLaser ()
methode.HitTest ()
.laser.graphics.clear ()
in de voor
lus.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.
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!
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.