Petit conseil Détection de collision entre les cercles

La détection de collision est une branche d'algorithmes qui vérifie si deux formes se chevauchent. Si vous construisez des jeux de physique ou d'action avec ActionScript, vous ne pourrez certainement pas échapper à la connaissance de ce sujet. Ceci est le premier de la série concernant la détection de collision. Dans cette astuce, nous examinerons la méthode de détection de collision intégrée à ActionScript., hitTestObject (), et écrivez notre propre pour détecter le chevauchement entre deux cercles.


Aperçu du résultat final

Ceci est le fichier SWF final que nous allons créer dans cette astuce. Cliquez sur le cercle bleu et faites-le glisser vers le vert. Une fois qu'ils se chevauchent, le cercle vert va changer de couleur; si vous supprimez à nouveau le cercle bleu, l’autre redeviendra vert.


Étape 1: Vérifications dans la boîte aux lettres

Ceux qui sont familiarisés avec ActionScript 2.0 reconnaîtront certainement la méthode., hitTest (). Cette commande vérifie le chevauchement entre deux formes ou entre une forme et un seul point. Dans ActionScript 3.0, il est divisé en deux méthodes distinctes: hitTestObject () et hitTestPoint ().

Nous allons regarder hitTestObject () premier. Cette commande convient généralement à la détection de collision pour les formes en forme de boîte (carrés, rectangles). Une boîte englobante est dessinée autour des formes et lorsque ces boîtes se chevauchent, hitTestObject () retourne vrai.

Découvrez l'exemple ci-dessous. Faites glisser la boîte bleue vers la verte. En se chevauchant, la nuance de la boîte verte s'assombrit.

J'attache ici le code ActionScript correspondant à la présentation ci-dessus. Boîte est une classe écrite personnalisée permettant de générer facilement des formes carrées. J'ai inclus les classes dans le dossier source; faites référence à eux. Le script important pour la détection de collision est mis en évidence ci-dessous.

 package import flash.display.Graphics; import flash.display.Sprite; import flash.events.MouseEvent; / ** * Simple hitTest avec les boîtes * @author Shiu * / [SWF (width = 400, height = 300)] public class Simple étend Sprite private var box1: Box, box2: Box; fonction publique Simple () box1 = new Box (0x0000FF); addChild (box1); box1.x = 250; box1.y = 250; box1.addEventListener (MouseEvent.MOUSE_DOWN, début); box1.addEventListener (MouseEvent.MOUSE_UP, fin); box2 = new Box (0x00FF00); addChild (box2); box2.x = 100; box2.y = 50;  Fonction privée start (e: MouseEvent): void e.target.startDrag (); e.target.addEventListener (MouseEvent.MOUSE_MOVE, check);  fonction privée end (e: MouseEvent): void e.target.stopDrag (); e.target.removeEventListener (MouseEvent.MOUSE_MOVE, check);  vérification de fonction privée (e: MouseEvent): void if (e.target.hitTestObject (box2)) box2.color = 0x00AA00; sinon box2.color = 0x00FF00; 

Étape 2: les lacunes des boîtes englobantes

Toutefois, la collision entre cercles ne peut pas être efficacement contrôlée à l'aide de cette commande. Découvrez la présentation ci-dessous. Faites glisser le cercle bleu vers le vert. Avant que les formes ne se rencontrent, leurs boîtes englobantes se chevauchent déjà et hitTestObject () est vrai. Nous avons besoin d'une solution plus précise.

Ce problème est répandu non seulement pour la détection de collision entre cercles, mais également pour les formes non carrées. Observez le diagramme ci-dessous. Pour les formes organiques difficiles à résoudre par des polygones, nous utiliserons une détection de collision précise au pixel près..


Diverses collisions inexactes détectées via hitTestObject.

Étape 3: Distance entre les centres

La solution à ce problème est assez simple: nous allons mesurer la distance entre les centres de ces cercles. Si les centres se rapprochent suffisamment les uns des autres, nous signalerons une collision comme étant vraie. Mais à quel point est-ce assez proche??


Distance entre les cercles.

Observez le diagramme ci-dessus. r1 fait référence au rayon de cercle1 et r2 fait référence au rayon de circle2. La distance entre les cercles est calculée sur chaque image. Si (et seulement si) il est égal ou inférieur à la somme des deux rayons (r1+ r2), alors les deux cercles doivent se toucher ou se chevaucher.


Étape 4: Détection de collision cercle-cercle

Voici le code ActionScript important pour la mise en œuvre du concept ci-dessus:

 minDist = circle1.radius + circle2.radius;
 vérification de fonction privée (e: MouseEvent): void var distance: Number = Math2.Pythagoras (circle1.x, circle1.y, circle2.x, circle2.y); si (distance <= minDist) circle2.color = 0x00FFAA; else circle2.color = 0x00FF00; 

Étape 5: Solution d'échantillon

Voici un échantillon de la solution. Faites glisser le cercle bleu vers le vert. Lorsqu'ils se chevauchent, vous verrez le changement de couleur du vert. Il revient à la normale lorsque les deux cercles ne se touchent pas.

J'ai inclus l'implémentation ActionScript ci-dessous.

 package import flash.display.Sprite; import flash.events.MouseEvent; / ** * Collision simple entre 2 cercles * @author Shiu * / [SWF (width = 400, height = 300)] public class Simple3 étend Sprite private var circle1: Circle, circle2: Circle; private var minDist: Number; fonction publique Simple3 () circle1 = new Circle (0x0055AA, 30); addChild (circle1); circle1.x = 250; circle1.y = 250; circle1.addEventListener (MouseEvent.MOUSE_DOWN, début); circle1.addEventListener (MouseEvent.MOUSE_UP, fin); circle2 = new Circle (0x00FF00, 30); addChild (circle2); circle2.x = 100; circle2.y = 50; minDist = circle1.radius + circle2.radius;  Fonction privée start (e: MouseEvent): void e.target.startDrag (); e.target.addEventListener (MouseEvent.MOUSE_MOVE, check);  fonction privée end (e: MouseEvent): void e.target.stopDrag (); e.target.removeEventListener (MouseEvent.MOUSE_MOVE, check);  vérification de fonction privée (e: MouseEvent): void var distance: Number = Math2.Pythagoras (circle1.x, circle1.y, circle2.x, circle2.y); si (distance <= minDist) circle2.color = 0x00FFAA; else circle2.color = 0x00FF00;   

Conclusion

Comme vous pouvez le constater, le principe général de la détection de collision consiste à utiliser des formules mathématiques pour vérifier les chevauchements entre différentes formes. Les mathématiques vectorielles jouent également un rôle important. Vient ensuite la collision entre un cercle et une ligne. Merci d'avoir lu et à bientôt.