Lasergenerator, Hindernisse und genaue Treffererkennung

Hallo Freunde. Das wichtigste Highlight dieses Tutorials ist genau Treffererkennung eines generierten Lasers. Diese Art von KI ist nützlich, um Action-Spiele zu erstellen, insbesondere im Falle von Sicherheitsinformationen mit Kameras, Laserpistolen usw. Setzen Sie Ihre Rakete auf den Rücken, und der Countdown beginnt?


Endergebnisvorschau

Werfen wir einen Blick auf das Endergebnis, auf das wir hinarbeiten:


Schritt 1: Vorbereiten der Flash-Datei

Öffnen Sie Flash und erstellen Sie ein neues Flash-Dokument (ActionScript 3.0)..

Stellen Sie die Bühnengröße auf eine beliebige Standardauflösung ein. Mein ist 500 x 350 px.

Stellen Sie die Bildrate auf 24 fps ein.

Speichern Sie die Datei in einem Ordner Ihrer Wahl.


Schritt 2: Lasergenerator erstellen

Lassen Sie uns nun einen Lasergenerator erstellen.

Zeichnen Sie einen Kreis mit Radius 20, d.h..

Nun müssen wir diesen Kreis in ein Flash-Symbol konvertieren, damit wir ihn mit ActionScript steuern können.

Wählen Sie den Kreis und drücken Sie F8 oder gehen Sie zu Ändern> In Symbol konvertieren. Wählen Sie Movie-Clip als Symboltyp aus. Stellen Sie auch den Registrierungspunkt auf Mitte ein, damit sich der Lasergenerator von seiner Mitte aus dreht. Art laserGenerator_MC in das Instanzennamensfeld ein und klicken Sie anschließend in der Gruppe "Erweitert" auf "Export für ActionScript", damit wir auf den Lasergenerator aus unserer Dokumentenklasse zugreifen können, die wir bald treffen werden.

Nachdem Sie alle obigen Optionen eingestellt haben, drücken Sie OK. Drücken Sie erneut OK, um das Dialogfeld mit der Warnung für die Klassendefinition anzuzeigen. Dadurch wird zur Laufzeit eine Klassendefinition für den Lasergenerator erstellt.

Jetzt brauchen wir nicht laserGenerator_MC Symbol auf der Bühne, da es im Bibliotheksfenster mit dem Bezeichnernamen verfügbar ist laserGenerator_MC. Löschen Sie deshalb dieses Symbol von der Bühne. Deine Bühne sollte jetzt leer sein.


Schritt 3: Das Aussehen des Lasergenerators verbessern

Nun werden wir diesem Generator einen Mund hinzufügen, um das Gefühl eines Gerätes zu erzeugen. Doppelklicken Sie im Bibliotheksfenster auf laserGenerator_MC Symbolsymbol (linke Seite des Symbolnamens), um in den Bearbeitungsmodus zu wechseln. Fügen Sie den Mund hinzu, wie unten gezeigt.

Fühlen Sie sich frei, Ihr eigenes Design hinzuzufügen.

Hinweis: Ändern Sie nicht die Position des Kreises, da wir ihn um seine Mitte drehen müssen.

Nachdem Sie dem Generator einen Mund hinzugefügt haben, verlassen Sie den Symbolbearbeitungsmodus und kehren Sie zur Hauptzeitleiste zurück.

Ihre Rakete hat den Boden verlassen. Der Lasergenerator ist bereit und wartet auf seine Ausführung.


Schritt 4: Dokumentklasse vorbereiten

Um unserer Szene ein Drama hinzuzufügen, benötigen wir ActionScript. Um klug zu handeln, brauchen wir eine Dokumentenklasse.

In diesem Schritt erstellen wir eine Grundstruktur unserer Dokumentenklasse.

Ausführliche Informationen zu Document Class finden Sie in diesem Quick Tip.

Erstellen Sie also eine neue ActionScript 3.0-Datei. Geben Sie den folgenden Code ein:

 Paket öffentliche Klasse Laser_HitDetection öffentliche Funktion Laser_HitDetection () // Konstruktorcode

Speichern Sie diese Dokumentenklasse als Laser_HitDetection.as im selben Ordner, in dem Sie Ihre FLA für dieses Tutorial gespeichert haben. Nizza abheben. Ihre Basisdokumentklasse ist fertig.


Schritt 5: Dokumentenklasse an FLA anhängen

Greifen Sie in Ihrer FLA-Datei auf das Eigenschaftenfenster des Dokuments zu und geben Sie den Namen der Klasse in das Feld "Dokumentklasse" ein, das in der Gruppe "Veröffentlichen" verfügbar ist.

Jetzt können wir mit FLA darüber kommunizieren Laser_HitDetection.as Dokumentenklasse.


Schritt 6: Platzieren Sie den Lasergenerator in Stage Center und richten Sie ihn aus

Wir erstellen eine Instanz eines Lasergenerators aus der Bibliothek und platzieren sie in der Mitte der Bühne.

Modifiziere den Laser_HitDetection.as Dokumentenklasse wie unten gezeigt (hervorgehobene Zeilen):

 package import flash.display.Sprite; public class Laser_HitDetection erweitert Sprite var laserGun: Sprite; // Instanz von laserGenerator_MC // Konstruktor public function Laser_HitDetection () CreateLaserGun ();  // Holen Sie sich den Lasergenerator aus der öffentlichen Public Library-Funktion CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Holen Sie es aus der Bibliothek addChild (laserGun); // Platziere den Lasergenerator in der Mitte der Bühne laserGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2; 

Wenn Sie den Film jetzt testen, sehen Sie unsere Laserpistole in der Mitte der Bühne.


Schritt 7: Verständnis CreateLaserGun () Methode

Im obigen Code haben wir verwendet Sprite Klasse, um eine Instanz eines Sprite-Objekts zu erstellen, das den Laser aufnehmen kann. Dafür deklarieren wir Variable als:

 var laserGun: Sprite;

Dann haben wir eine neue Methode hinzugefügt "CreateLaserGun ()"in dem wir eine Instanz von laserGenerator_MC von der Bibliothek bis zu den oben genannten Laserpistole var als:

 laserGun = new laserGenerator_MC ();

Nachdem wir es zur Bühne hinzugefügt hatten, platzierten wir es in der Mitte der Bühne als:

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

Schließlich haben wir diese Methode aus der Konstruktormethode der Dokumentklasse aufgerufen:

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

Rakete beschleunigt mit vollem Schub. Wir werden diese Laserpistole sehr bald aktivieren, wodurch der Laser projiziert wird. Davor werden wir einige Hindernisse hinzufügen. Lass uns gehen.


Schritt 8: Hinzufügen von Hindernissen verschiedener Formen

Um mit der Treffererkennung zu experimentieren, benötigen wir einige Hindernisse auf der Bühne. Zeichnen Sie also auf der Bühne verschiedene Formen, die konvex-konkaven Flächen, Steigungsklettern und geraden Kanten ähneln, wie unten gezeigt:


Schritt 9: Konvertieren aller Hindernisse in einen einzelnen MovieClip

Jetzt werden wir alle diese Formen in ein Symbol setzen. Wählen Sie alle Formen gleichzeitig aus und drücken Sie F8 oder gehen Sie zu Ändern> In Symbol konvertieren. Wählen Sie als Symboltyp Movie Clip aus. Nennen Sie dieses Symbol Hindernisse_MC im Namenstextfeld. Stellen Sie den Registrierungspunkt in der Mitte ein. Aktivieren Sie auch "Export für ActionScript", damit wir von unserer Dokumentenklasse aus darauf zugreifen können.

Nach dem Konvertieren in MovieClip haben wir Hindernisse_MC in der Bibliothek mit dem gleichen Bezeichnernamen. Gleichsam als laserGenerator_MC Wir brauchen dieses Symbol nicht auf der Bühne, löschen Sie es also von der Bühne. Jetzt ist deine Bühne leer.


Schritt 10: Platzieren Sie das Hindernissymbol in der Bühnenmitte und richten Sie es aus

Die Art, wie wir unsere platziert haben laserGenerator_MC auf der bühne, in der mitte, werden wir ähnlich platzieren Hindernisse_MC Symbol auf der Bühne. Ändern Sie die Dokumentenklasse wie folgt:

 package import flash.display.Sprite; public class Laser_HitDetection erweitert Sprite var laserGun: Sprite; // Instanz von laserGenerator_MC var Hindernisse: Sprite; // Instanz von obstacles_MC // Konstruktor öffentliche Funktion Laser_HitDetection () CreateLaserGun (); CreateObstacles ();  // Holen Sie sich den Lasergenerator aus der öffentlichen Public Library-Funktion CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Holen Sie es aus der Bibliothek addChild (laserGun); // Platziere den Lasergenerator in der Mitte der Bühne laserGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2;  // Hole und stelle Hindernisse von der öffentlichen Bibliotheksfunktion CreateObstacles (): void hindacles = new obstacles_MC (); // Holen Sie es aus der Bibliothek addChild (Hindernisse); // Platziere Hindernisse in der Mitte der Bühnenhindernisse.x = stage.stageWidth / 2; Hindernisse.y = stage.stageHeight / 2; 

Testen Sie den Film, um Hindernisse um die Laserpistole zu sehen.

Ihre Rakete erreicht die Endgeschwindigkeit. Jetzt ist es Zeit, die Laserpistole zu aktivieren. Es muss den Laser daraus erzeugen. Lass uns das jetzt machen.


Schritt 11: Laser projizieren

Wie werden wir den Laser nachahmen? Irgendwelche Ideen?? Wie wäre es mit einigen Mitgliedern der Graphics-Klasse? lineStyle (), ziehen nach(), lineTo (). Wenn Sie mit diesen Methoden vertraut sind, ist Ihre Arbeit einfach. Für diejenigen, die diese Methoden nicht kennen, sind wir immer bei Ihnen. Lassen Sie uns sie im Detail sehen.

Wir werden eine neue Methode hinzufügen Projektlaser (). Lassen Sie uns unser ändern Laser_HitDetection Dokumentenklasse wie folgt:

 // Konstruktorpaket import flash.display.Sprite; public class Laser_HitDetection erweitert Sprite var laserGun: Sprite; // Instanz von laserGenerator_MC var Hindernisse: Sprite; // Instanz von Hindernissen_MC var laser: Sprite; var startX: Anzahl; // x Startpunkt des Lasers var startY: Number; // y Startpunkt des Lasers var endX: Number; // x Endpunkt des Lasers var endY: Number; // y Endpunkt des Lasers // Konstruktor öffentliche Funktion Laser_HitDetection () CreateLaserGun (); CreateObstacles (); Projektlaser ();  // Holen Sie sich den Lasergenerator aus der öffentlichen Public Library-Funktion CreateLaserGun (): void laserGun = new laserGenerator_MC (); // Holen Sie es aus der Bibliothek addChild (laserGun); // Platziere den Lasergenerator in der Mitte der Bühne laserGun.x = stage.stageWidth / 2; laserGun.y = stage.stageHeight / 2;  // Hole und stelle Hindernisse von der öffentlichen Bibliotheksfunktion CreateObstacles (): void hindacles = new obstacles_MC (); // Holen Sie es aus der Bibliothek addChild (Hindernisse); // Platziere Hindernisse in der Mitte der Bühnenhindernisse.x = stage.stageWidth / 2; Hindernisse.y = stage.stageHeight / 2;  // Projiziere einen Laser von einer öffentlichen Lasergenerator-Funktion aus ProjectLaser (): void laser = new Sprite (); addChild (Laser); // Ursprung des Lasers als Mittelpunkt der Laserpistole setzen startX = laserGun.x; startY = laserGun.y; // Endpunkt des Lasers einstellen endX = startX + 230; endY = startY; // Zeichne laser laser.graphics.lineStyle (1, 0xFF0000); laser.graphics.moveTo (startX, startY); lasergraphics.lineTo (endX, endY); 

Testen Sie den Film.

Die Rakete steht ganz oben am Himmel. Die Laserpistole hat begonnen, den Laser zu projizieren. Wie ist das passiert? Versuchen wir, den obigen Code im nächsten Schritt zu verstehen.


Schritt 12: Wie wird der Laser projiziert??

Im obigen Schritt haben wir erfolgreich einen Laser projiziert. Dafür haben wir folgende Aufgaben ausgeführt:

Zuerst haben wir fünf neue Variablen deklariert:

 Var-Laser: Sprite; var startX: Anzahl; // x Startpunkt des Lasers var startY: Number; // y Startpunkt des Lasers var endX: Number; // x Endpunkt des Lasers var endY: Number; // y Endpunkt des Lasers

Zweitens haben wir eine neue Methode hinzugefügt Projektlaser ():

 öffentliche Funktion ProjectLaser (): void laser = new Sprite (); addChild (Laser); // Ursprung des Lasers als Mittelpunkt der Laserpistole setzen startX = laserGun.x; startY = laserGun.y; // Endpunkt des Lasers einstellen endX = startX + 230; endY = startY; // Zeichne laser laser.graphics.lineStyle (1, 0xFF0000); laser.graphics.moveTo (startX, startY); lasergraphics.lineTo (endX, endY); 

Schritt 13: Verständnis Projektlaser () Methode

In der obigen Methode haben wir zunächst ein leeres Sprite-Objekt zum Halten des Lasers erstellt und es wie folgt zur Bühne hinzugefügt:

 Laser = neues Sprite (); addChild (Laser);

Da wir wollten, dass der Laser von der Laserpistole aus projiziert, weisen wir den X-Wert der Laserpistole zu startX und Y-Wert zu startY Wie nachfolgend dargestellt:

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

(Später haben wir diese Werte zur Verfügung gestellt moveTo (startX, startY) Methode, die wir bald treffen werden.)

Dann haben wir definiert endX und endY:

 endX = startX + 230; endY = startY;

Werte, die den obigen Variablen zugewiesen wurden, sind temporäre Werte. Wir haben sie nur verwendet, um die grundlegende Projektion eines Lasers zu zeigen. In den nächsten Schritten werden wir diese Werte durch einfache Berechnungen ändern. Diese Werte sind der Schlüssel für eine perfekte Treffererkennung des Lasers. Wir werden sie später in dieser Sitzung studieren.

Und jetzt der wichtige Teil dieser Methode. Zeichnen einer geraden Linie in einem Laser-Sprite-Objekt, um den projizierten Laser zu imitieren.

Zuerst haben wir den Stil der zu zeichnenden Linie wie folgt behandelt:

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

Diese lineStyle () -Methode wird verwendet, um die Gestaltung des Strichs des Zeichnungsobjekts wie Linie, Rechteck, Oval usw. zu steuern. Sie können maximal acht Argumente für diese Methode angeben. Wenn nicht angegeben, werden stattdessen Standardwerte zugewiesen. Für unser Beispiel benötigen wir nur zwei Argumente. Das erste Argument ist die Dicke der Linie (d. H. 1) und das zweite Argument ist die Farbe der Linie (d. H. 0xFF0000, was ist rot).

Ausführliche Informationen zu dieser Methode finden Sie in der Adobe-Hilfe unter "lineStyle (args?)".

Dann haben wir den Startpunkt der Linie wie folgt platziert:

 laser.graphics.moveTo (startX, startY);

startX und startY stellt sicher, dass der Startpunkt die Mitte der Laserpistole sein muss.

Danach haben wir die Zeile aufgearbeitet:

 lasergraphics.lineTo (endX, endY);

Denken Sie daran, dass diese endX und endY temporäre Werte sind, nur um die Projektion anzuzeigen. Wir müssen sie anpassen, wenn sich ein Hindernis im Weg des Lasers befindet. Wir werden das in den nächsten Schritten rechnen.

Also haben wir eine Linie aus (startX, startY) an (endX, endY).

Die Rakete geht und geht. Sehen Sie diese Landschaften, Wasserlandschaften?

Nun ist es Zeit für die wirkliche Aktion. Treffererkennung mit Hindernissen.


Schritt 14: Treffererkennung mit Hindernissen

Jetzt sind wir mit einer Laserpistole ausgestattet. Wir haben auch mehrere Hindernisse. Wir sind auf der Ebene, wo wir eine Treffererkennung hinzufügen können, die der Szene sicherlich die Bedeutung verleiht.

Möglicherweise denken Sie, dass diese hochgenaue Treffererkennung komplexe Berechnungen erfordert. Wenn ja, dann liegen Sie falsch. Es verwendet einfach die in ActionScript eingebaute hitTestPoint () - Methode zusammen mit einer zum Schleife. Die komplexe Mathematik hinter der perfekten Treffererkennung wird mit dieser Methode behandelt. Sie müssen nur diese Methode verwenden und a zum Schleife auf intelligente Weise.

Wir werden einige wichtige Änderungen an unserer Dokumentenklasse vornehmen, hauptsächlich in Projektlaser () Methode und einige neue Vars, so beobachten und sorgfältig anwenden. Lassen Sie uns es wie gezeigt ändern:

Fügen Sie zuerst diese neuen Variablen hinzu:

 var rad: Zahl = Math.PI / 180; // Wird zur Berechnung des Winkels im Bogenmaß verwendet var maxDist: Number = 250; // maximale Entfernung, die der Laser zurücklegen soll var varistedist: Anzahl; // Neue maximale Entfernung, wenn ein Hindernis in eine Richtung kommt

Dann ändern Projektlaser () Methode durch Hinzufügen zum Schleife wie unten gezeigt (auch das jetzt beachten endX und endY sind drinnen zum Schleife):

 // Projiziere einen Laser vom Lasergenerator-Gerät aus public function ProjectLaser (): void laser = new Sprite (); addChild (Laser); // Ursprung des Lasers als Mittelpunkt der Laserpistole setzen startX = laserGun.x; startY = laserGun.y; für (adjustedDist = 0; adjustDist < 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 ); 

Testen Sie den Film.

Boom? Ich bin mir sicher. Mit diesem Effekt können Sie ein Flash-Spiel mit Sicherheitsintelligenz erstellen. Perfekte KI, um ein interessantes Spiel in Flash zu entwickeln.


Schritt 15: Wie die Treffererkennung geschah

Zunächst haben wir unserer Dokumentklasse neue Variablen hinzugefügt (siehe Abbildung):

Anfangs ein Winkel im Bogenmaß

 var rad: Zahl = Math.PI / 180; // Wird verwendet, um den Winkel im Bogenmaß zu berechnen

Die obige Variable wird in der Formel verwendet, um einen Winkel im Bogenmaß zu berechnen.

Die Formel lautet, Bogenmaß = Grad * Math.PI / 180. Mehr Infos hier. Wir haben diese Formel in unserem Code in den folgenden Zeilen verwendet:

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

Im laserGun.rotation * rad, grad = laserGun.rotation, und rad = Math.PI / 180.

Zweitens haben wir eine Variable für die maximale Entfernung erstellt, die der Laser zurücklegen muss:

 var maxDist: Number = 250; // maximale Entfernung, die der Laser zurücklegen muss

Diese Variable bestimmt die maximale Entfernung, die der Laser zurücklegen muss. Da der Laser nicht über den sichtbaren Bereich gezogen werden muss, definieren wir einen schönen Endpunkt. Diese Var wird das tun, was benötigt wird.

Drittens haben wir eine Variation für die aktuelle Entfernung des Lasers zum Zeitpunkt der Kreuzung mit einem Hindernis.

 var adjustDist: Anzahl; // Neue maximale Entfernung, wenn ein Hindernis in eine Richtung kommt

Wenn ein Hindernis auf den Weg des Lasers kommt, wird der Laser blockiert, anstatt sich in die maximale Entfernung zu bewegen.

Die Entfernung nach dem Blockieren eines Lasers ist abhängig von der Situation nichts anderes als die eingestellte Entfernung.

Das zum Schleife und hitTestPoint () Beide spielen eine wichtige Rolle bei der Berechnung dieser Entfernung.

Viertens haben wir modifiziert Projektlaser () Methode durch Hinzufügen von ActionScript hitTestPoint () zusammen mit einem zum Schleife. Wurden zugeordnet endX und endY Variablen.

 für (adjustedDist = 0; adjustDist < 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;  

Die for-Schleife stellt sicher, dass die eingestellte Entfernung bis zur maximalen Entfernung erhöht wird. Sie denken vielleicht "Was macht es Spaß, die eingestellte Entfernung gleich der maximalen Entfernung zu machen?"

Tatsächlich darf diese eingestellte Entfernung natürlich mit der maximalen Entfernung übereinstimmen, aber sobald sie auf Hindernisse trifft (die von erkannt werden) hitTestPoint () Methode) Diese Entfernung wird als maximale Entfernung für die aktuelle Situation markiert. Dank an hitTestPoint () um die Aufgabe so einfach zu machen.

Wir haben auch neu zugewiesen endX und endY Werte als:

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

Die Trigonometrie-Funktionen Math.cos () und Math.sin () werden verwendet, um den Winkel des Lasers bei der Rotation der Laserkanone zu berechnen.

In einer einfachen Form sorgt es dafür, dass der Laser auf die Laserpistole gerichtet wird. Es ist wichtig, dass Laserpistole und Laser synchron sind. Immer wenn die Laserpistole gedreht wird, folgt der Laser der Rotation.

Weitere Informationen zur Trigonometrie finden Sie in diesem Quick Tip.

Endlich der Höhepunkt der Szene:

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

hitTestPoint () Methode nimmt drei Parameter, von denen der erste und der zweite Parameter notwendig sind und der dritte (shapeFlag) wird als Standardeinstellung beibehalten (d. h. falsch) falls nicht angegeben.

In unserem Beispiel, shapeFlag ist eingestellt auf wahr da wir eine Treffererkennung in Bezug auf die genaue Form des Zielobjekts (d. h. Hindernisse). Wenn dieser Wert auf gesetzt ist falsch Die Treffererkennung erfolgt in Bezug auf den Begrenzungsrahmen dieses Objekts und nicht auf die genaue Form.

Der erste und der zweite Parameter von hitTestPoint () Definieren Sie einen Punkt (x, y), an dem der Schnittpunkt mit dem Anzeigeobjekt überprüft werden soll. In unserem Fall Hindernisse ist das Anzeigeobjekt und endX und endY repräsentiert den Schnittpunkt auf der Bühne.

Unklar? Recht. Zur Vereinfachung setzen wir die Logik wie folgt zusammen:

  1. Das zum Schleife ermöglicht die Fortsetzung der Projektion des Lasers (durch Aktualisieren endX und endY) wenn innerhalb der maximalen Entfernung.
  2. hitTestPoint () wartet darauf, das zu brechen zum Schleife, sobald es die Kreuzung sieht. Einmal die zum Schleife ist gebrochen, endX und endY sind eingefroren.
  3. Endlich diese eingefroren endX und endY sind an die übergeben graphics.lineTo () Methode.

Schritt 16: Anwenden der Rotation auf die Laserpistole

Um der Laserpistole Rotation hinzuzufügen, müssen wir einige wichtige Änderungen vornehmen:

  1. Umstrukturierung Projektlaser () Methode.
  2. Platzierung der gesamten Treffererkennungslogik in neuer Methode HitTest ().
  3. Neue Anweisung hinzufügen laser.graphics.clear () in dem zum Schleife.
  4. Anweisung importieren importiere flash.events.Event

Zuerst werden wir das restrukturieren Projektlaser () Methode durch Verschieben der gesamten Treffererkennungslogik in der neuen Methode HitTest ().

Dann werden wir hinzufügen laser.graphics.clear () Aussage vor laser.graphics.lineStyle (1, 0xFF0000) Aussage innerhalb der zum Schleife der neuen Methode HitTest (). Dadurch wird die alte Projektion des Lasers von der Bühne entfernt, wenn sich die Laserpistole dreht.

Mal sehen, wie es nach allen vier großen Änderungen aussehen wird:

 öffentliche Funktion ProjectLaser (): void laser = new Sprite (); addChild (Laser); // Ursprung des Lasers als Mittelpunkt der Laserpistole setzen startX = laserGun.x; startY = laserGun.y;  // Hit test public function HitTest (): void for (adjustedist = 0; adjustedist) < 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 ); 

Sie fragen sich vielleicht, warum wir so große Veränderungen vorgenommen haben? Der einzige Grund ist ENTER_FRAME Veranstaltung.

Um eine kontinuierliche Rotation anzuwenden, fügen wir eine neue Methode hinzu, LaserGunRotation (evt: Event) welches von aktiviert wird ENTER_FRAME Ereignis (dh es wird 24 Mal pro Sekunde ausgeführt, da unsere Bildrate 24 Bilder pro Sekunde beträgt). Wenn dieses Ereignis verwendet wird, müssen Sie nur solche Eigenschaften hinzufügen, die Sie über einen bestimmten Zeitraum ändern möchten. Vermeiden Sie es, die Werte einzugeben, die während der Ausführung konstant bleiben.

In unserem Fall, wenn Sie alt beobachten Projektlaser () Methode hat es:

 Laser = neues Sprite (); addChild (Laser); // Laserpistole drehen

Stellen Sie sich vor, Sie fügen obige Anweisungen in einer Methode ein, die verwendet ENTER_FRAME Veranstaltung; Dann wird ein neues Laser-Sprite-Objekt erstellt und wiederholt zur Bühne hinzugefügt - 24 Mal pro Sekunde.

Das ist absolut unnötig. Deshalb haben wir umstrukturiert Projektlaser () Methode und neue Methode hinzugefügt HitTest (). Sie können umbenennen Projektlaser () Methode zu InitializeLaser () da projiziert der laser nicht mehr. Jetzt wird nur noch die leere Halterung für den Laser erstellt und der Startpunkt festgelegt. Die Projektion wird in einer neuen Methode behandelt, HitTest ().

Nun sehen wir uns die neue Methode an LaserGunRotation (evt: Event). Fügen Sie zuvor die folgende Importanweisung am Anfang der Dokumentenklasse hinzu:

 import flash.events.Event;

Fügen Sie die folgende Methode hinzu:

 // Rotate Laser Gun öffentliche Funktion LaserGunRotation (evt: Event): void laserGun.rotation + = 0.5; HitTest (); 

Vergessen Sie auch nicht, diese Methode mit einem ENTER_FRAME Ereignis innerhalb des Konstruktors funktioniert wie folgt:

 // Konstruktor public function Laser_HitDetection () CreateLaserGun (); CreateObstacles (); Projektlaser (); addEventListener (Event.ENTER_FRAME, LaserGunRotation); 

Damit wird es eingerichtet, das auszuführen LaserGunRotation () Funktion 24 mal pro Sekunde.

Testen Sie den Film.

Die Rakete ist bereits in Wolken eingedrungen. Sehen Sie die schöne Erde.


Schritt 17: Hinzufügen von Steuerelementen zur Genauigkeit der Treffererkennung

In diesem Schritt fügen wir ein Steuerelement hinzu, um die Genauigkeit der Treffererkennung anzupassen. Dies ist wichtig, da Sie nicht jedes Mal die genaue Treffererkennung benötigen. Möglicherweise benötigen Sie eine durchschnittliche Treffererkennung. Dies hilft auch, den CPU-Verbrauch zum Zeitpunkt der Treffererkennung zu reduzieren.

Wir werden eine neue Variable einführen Toleranz wie:

 Var Toleranz: Anzahl = 1;

Dann werden wir das ändern zum Inkrement-Anweisung der Schleife als:

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

Nun sieht die for-Schleife so aus:

 für (adjustedDist = 0; adjustDist < 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;  

Das bedeutet, dass wir nicht bei jedem Pixel der Laserlinie nach einer Kollision suchen, sondern nur bei jedem zweiten Pixel oder jedem dritten Pixel usw. auf eine Kollision.

Wenn Sie den Wert für "Toleranz" verringern, wird die Genauigkeit der Treffererkennung erhöht, es wird jedoch mehr CPU-Leistung benötigt. Versuchen Sie, mit verschiedenen Werten für "Toleranz" zu experimentieren.

Freunde, es ist Zeit, die Rakete zu verlassen und den Fallschirm zu öffnen. Landen Sie sicher auf dem Boden und verwenden Sie die oben genannte Technik in Ihren Flash-Spielen und Anwendungen. Genießen!


Fazit:

In diesem Tutorial haben wir hauptsächlich die perfekte Verwendung von gesehen hitTestPoint () und ein zum Schleife, um eine genaue Treffererkennung ohne komplexe Berechnungen zu erstellen.

Dieser Effekt kann in einem Sicherheitsspiel verwendet werden, bei dem Kameras und Laserpistolen benötigt werden.