Die Kollisionserkennung ist ein Zweig von Algorithmen, der prüft, ob sich zwei Formen überlappen. Wenn Sie mit ActionScript Physik- oder Action-Spiele erstellen, werden Sie sich mit diesem Thema sicherlich nicht auskennen. Dies ist die erste Serie zur Kollisionserkennung. In diesem Schnelltipp werden wir uns die integrierte Kollisionserkennungsmethode von ActionScript anschauen, hitTestObject ()
, und schreiben Sie unsere eigenen, um Überlappungen zwischen zwei Kreisen zu erkennen.
Dies ist die letzte SWF-Datei, die wir in diesem Quick Tip erstellen werden. Klicken Sie auf den blauen Kreis und ziehen Sie ihn in Richtung des grünen Kreises. Sobald sie sich überlappen, ändert der grüne Kreis seine Farbe. Wenn Sie den blauen Kreis wieder entfernen, wird der andere wieder grün.
Diejenigen, die mit ActionScript 2.0 vertraut sind, werden die Methode definitiv erkennen, hitTest ()
. Dieser Befehl prüft, ob sich zwei Formen überlappen oder zwischen einer Form und einem einzelnen Punkt. In ActionScript 3.0 gibt es zwei getrennte Methoden: hitTestObject ()
und hitTestPoint ()
.
Wir werden uns anschauen hitTestObject ()
zuerst. Dieser Befehl eignet sich im Allgemeinen zur Kollisionserkennung für kastenähnliche Formen (Quadrate, Rechtecke). Ein Begrenzungsrahmen wird um Formen gezeichnet und wenn diese Begrenzungsrahmen einander überlappen, hitTestObject ()
gibt wahr zurück.
Schauen Sie sich das Beispiel unten an. Ziehen Sie das blaue Kästchen in Richtung des grünen. Wenn sie sich überlappen, verdunkelt sich der Schatten der grünen Box.
Ich füge hier den entsprechenden ActionScript-Code hinzu, der die obige Präsentation generiert. Box
ist eine benutzerdefinierte Klasse zum einfachen Generieren von quadratischen Formen. Ich habe die Klassen in den Quellordner aufgenommen; verweisen Sie auf sie. Das wichtige Skript für die Kollisionserkennung ist unten hervorgehoben.
Paket import flash.display.Graphics; import flash.display.Sprite; import flash.events.MouseEvent; / ** * Simple hitTest mit Boxen * @author Shiu * / [SWF (width = 400, height = 300)] public class Einfach erweitert Sprite private var box1: Box, box2: Box; öffentliche Funktion Simple () box1 = new Box (0x0000FF); addChild (box1); box1.x = 250; box1.y = 250; box1.addEventListener (MouseEvent.MOUSE_DOWN, start); box1.addEventListener (MouseEvent.MOUSE_UP, end); Box2 = neue Box (0x00FF00); addChild (box2); box2.x = 100; box2.y = 50; private Funktion start (e: MouseEvent): void e.target.startDrag (); e.target.addEventListener (MouseEvent.MOUSE_MOVE, check); private Funktion end (e: MouseEvent): void e.target.stopDrag (); e.target.removeEventListener (MouseEvent.MOUSE_MOVE, check); private Funktionsprüfung (e: MouseEvent): void if (e.target.hitTestObject (box2)) box2.color = 0x00AA00; else box2.color = 0x00FF00;
Die Kollision zwischen Kreisen kann mit diesem Befehl jedoch nicht wirksam überprüft werden. Schauen Sie sich die Präsentation unten an. Ziehen Sie den blauen Kreis in Richtung des grünen. Bevor die Formen kollidieren, überlappen sich die Begrenzungsrahmen bereits und hitTestObject ()
ist wahr. Wir brauchen eine genauere Lösung.
Dieses Problem tritt nicht nur bei der Kollisionserkennung zwischen Kreisen auf, sondern allgemein bei nicht quadratischen Formen. Beachten Sie das folgende Diagramm. Für organische Formen, die von Polygonen nur schwer aufgelöst werden können, verwenden wir die pixelgenaue Kollisionserkennung.
Die Lösung dieses Problems ist ziemlich einfach: Wir werden den Abstand zwischen den Mittelpunkten dieser Kreise messen. Wenn sich die Zentren nahe genug nähern, werden wir die Kollision als wahr kennzeichnen. Aber wie nah ist nah genug?
Beachten Sie das obige Diagramm. r1 bezieht sich auf den Radius von circle1 und r2 bezieht sich auf den Radius von Kreis2. Der Abstand zwischen den Kreisen wird für jeden Rahmen berechnet. Wenn (und nur dann) ist sie gleich oder kleiner als die Summe beider Radien (r1+ r2), dann müssen sich die beiden Kreise berühren oder überlappen.
Hier sind die wichtigen ActionScript-Anweisungen für die Implementierung des obigen Konzepts:
minDist = circle1.radius + circle2.radius;
private Funktionsprüfung (e: MouseEvent): void var distance: Number = Math2.Pythagoras (circle1.x, circle1.y, circle2.x, circle2.y); wenn (Entfernung) <= minDist) circle2.color = 0x00FFAA; else circle2.color = 0x00FF00;
Hier ist eine Probe der Lösung. Ziehen Sie den blauen Kreis in Richtung des grünen. Wenn sie sich überlappen, ändert sich die Farbe des Grüns. Wenn beide Kreise nicht kollidieren, wird der Normalwert wiederhergestellt.
Ich habe die ActionScript-Implementierung unten eingefügt.
package import flash.display.Sprite; import flash.events.MouseEvent; / ** * Einfache Kollision zwischen 2 Kreisen * @author Shiu * / [SWF (width = 400, height = 300)] public class Simple3 erweitert Sprite private var circle1: Circle, circle2: Circle; private var minDist: Anzahl; öffentliche Funktion Simple3 () circle1 = neuer Kreis (0x0055AA, 30); addChild (circle1); Kreis1.x = 250; Kreis1.y = 250; circle1.addEventListener (MouseEvent.MOUSE_DOWN, start); circle1.addEventListener (MouseEvent.MOUSE_UP, end); Kreis2 = neuer Kreis (0x00FF00, 30); addChild (circle2); Kreis2.x = 100; Kreis2.y = 50; minDist = circle1.radius + circle2.radius; private Funktion start (e: MouseEvent): void e.target.startDrag (); e.target.addEventListener (MouseEvent.MOUSE_MOVE, check); private Funktion end (e: MouseEvent): void e.target.stopDrag (); e.target.removeEventListener (MouseEvent.MOUSE_MOVE, check); Private Funktionsprüfung (e: MouseEvent): void var distance: Number = Math2.Pythagoras (circle1.x, circle1.y, circle2.x, circle2.y); wenn (Entfernung) <= minDist) circle2.color = 0x00FFAA; else circle2.color = 0x00FF00;
Wie Sie sehen, besteht das allgemeine Prinzip der Kollisionserkennung darin, mathematische Formeln zu verwenden, um Überlappungen zwischen verschiedenen Formen zu überprüfen. Auch die Vektor-Mathematik spielt eine wichtige Rolle. Als nächstes kommt eine Kollision zwischen einem Kreis und einer Linie. Danke fürs Lesen und bis bald.