Il rilevamento delle collisioni è un ramo di algoritmi che controlla se due forme si sovrappongono. Se costruisci giochi di fisica o d'azione con ActionScript, non ti sfuggirà di certo la conoscenza di questo argomento. Questa è la prima della serie riguardante il rilevamento delle collisioni. In questo suggerimento, esamineremo il metodo di rilevamento delle collisioni incorporato di ActionScript, hitTestObject ()
, e scrivi il nostro per rilevare la sovrapposizione tra due cerchi.
Questo è il SWF finale che creeremo in questo suggerimento rapido. Fai clic sul cerchio blu e trascinalo verso quello verde. Una volta sovrapposti, il cerchio verde cambierà colore; se rimuovi il cerchio blu, l'altro tornerà ad essere verde.
Coloro che conoscono ActionScript 2.0 riconosceranno sicuramente il metodo, hitTest ()
. Questo comando controlla la sovrapposizione tra due forme, o tra una forma e un singolo punto. In ActionScript 3.0 è suddiviso in due metodi separati: hitTestObject ()
e hitTestPoint ()
.
Guarderemo hitTestObject ()
primo. Questo commn è generalmente adatto al rilevamento di collisioni per forme a scatola (quadrati, rettangoli). Una casella di delimitazione viene tracciata attorno alle forme e quando queste caselle di delimitazione si sovrappongono l'una all'altra, hitTestObject ()
ritorna vero.
Guarda l'esempio qui sotto. Trascina la casella blu verso quella verde. Mentre si sovrappongono, l'ombra della scatola verde si scurisce.
Allego qui il codice ActionScript corrispondente che genera la presentazione sopra. Scatola
è una classe scritta personalizzata per generare facilmente forme quadrate. Ho incluso le classi nella cartella sorgente; fare riferimento a loro. L'importante script per il rilevamento delle collisioni è evidenziato di seguito.
package import flash.display.Graphics; import flash.display.Sprite; import flash.events.MouseEvent; / ** * Semplice hitTest con caselle * @author Shiu * / [SWF (width = 400, height = 300)] public public Simple extends Sprite private var box1: Box, box2: Box; funzione pubblica 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 = new Box (0x00FF00); addChild (box2); box2.x = 100; box2.y = 50; funzione privata start (e: MouseEvent): void e.target.startDrag (); e.target.addEventListener (MouseEvent.MOUSE_MOVE, verifica); private function end (e: MouseEvent): void e.target.stopDrag (); e.target.removeEventListener (MouseEvent.MOUSE_MOVE, verifica); controllo funzione privata (e: MouseEvent): void if (e.target.hitTestObject (box2)) box2.color = 0x00AA00; else box2.color = 0x00FF00;
Tuttavia, la collisione tra i cerchi non può essere controllata efficacemente usando questo comando. Guarda la presentazione qui sotto. Trascina il cerchio blu verso quello verde. Prima che le forme si scontrino, le loro scatole di delimitazione si sovrappongono e hitTestObject ()
è vero. Abbiamo bisogno di una soluzione più accurata.
Questo problema è prevalente non solo per il rilevamento delle collisioni tra i cerchi, ma in genere per le forme non quadrate. Osservare lo schema qui sotto. Per le forme organiche che sono difficili da risolvere con i poligoni, utilizzeremo il rilevamento delle collisioni con precisione pixel.
La soluzione a questo problema è abbastanza semplice: misureremo la distanza tra i centri di questi cerchi. Se i centri si avvicinano abbastanza l'un l'altro, contrassegneremo la collisione come vera. Ma quanto vicino è abbastanza vicino?
Osservare lo schema sopra. r1 si riferisce al raggio di circle1 e r2 si riferisce al raggio di circle2. La distanza tra i cerchi è calcolata su ogni fotogramma. Se (e solo se) è uguale o inferiore alla somma di entrambi i raggi (r1+ r2), quindi i due cerchi devono essere in contatto o sovrapposti.
Ecco l'importante ActionScript per l'implementazione del concetto di cui sopra:
minDist = circle1.radius + circle2.radius;
controllo della funzione privata (e: MouseEvent): void var distance: Number = Math2.Pythagoras (circle1.x, circle1.y, circle2.x, circle2.y); se (distanza <= minDist) circle2.color = 0x00FFAA; else circle2.color = 0x00FF00;
Ecco un esempio della soluzione. Trascina il cerchio blu verso quello verde. Mentre si sovrappongono, vedrai il cambio di colore del verde. Ritorna normale quando entrambi i cerchi non scontrano.
Ho incluso l'implementazione di ActionScript qui sotto.
pacchetto import flash.display.Sprite; import flash.events.MouseEvent; / ** * Semplice collisione tra 2 cerchi * @autore Shiu * / [SWF (larghezza = 400, altezza = 300)] public class Simple3 estende Sprite private var circle1: Circle, circle2: Circle; private var minDist: Number; funzione pubblica Simple3 () circle1 = new Circle (0x0055AA, 30); addChild (circle1); circle1.x = 250; circle1.y = 250; circle1.addEventListener (MouseEvent.MOUSE_DOWN, start); circle1.addEventListener (MouseEvent.MOUSE_UP, end); circle2 = new Circle (0x00FF00, 30); addChild (circle2); circle2.x = 100; circle2.y = 50; minDist = circle1.radius + circle2.radius; funzione privata start (e: MouseEvent): void e.target.startDrag (); e.target.addEventListener (MouseEvent.MOUSE_MOVE, verifica); private function end (e: MouseEvent): void e.target.stopDrag (); e.target.removeEventListener (MouseEvent.MOUSE_MOVE, verifica); controllo funzione privata (e: MouseEvent): void var distance: Number = Math2.Pythagoras (circle1.x, circle1.y, circle2.x, circle2.y); se (distanza <= minDist) circle2.color = 0x00FFAA; else circle2.color = 0x00FF00;
Come puoi vedere, il principio generale del rilevamento delle collisioni consiste nell'utilizzare formule matematiche per verificare la sovrapposizione tra forme diverse. Anche la matematica vettoriale gioca un ruolo importante. Il prossimo a venire è la collisione tra un cerchio e una linea. Grazie per la lettura e ci vediamo presto.