Archives du mot-clé hitTestObject

Flex Library – Détection de collision avec HitTest (AS3)

Toute personne qui déjà essayé de faire un jeu en Flash connait la méthode hitTest qui permet de savoir si deux objets sont entrés en collision. Par exemple, pour savoir si un personnage est bien sûr le sol ou quand un projectile touche un ennemi. En AS3, il existe deux méthodes sur DisplayObject: hitTestObject() et hitTestPoint().

La méthode hitTestObject vérifie la collision entre deux DisplayObject alors que la méthode hitTestPoint vérifie la collision entre un Point et un DisplayObject. Pour mon application Flex, je voulais faire un outil permettant de faire un cadre de sélection, comme dans d’autres logiciels de graphisme (Adobe PhotoShop, Adobe Illustrator …). Cette sélection devait se faire sur des objets de type Sprite qui pouvaient avoir des formes diverses. Donc pas forcement des rectangles mais plutôt des polygones. Afin de détecter quelles étaient les géométries qui se trouvent dans mon cadre de sélection (un Sprite lui aussi), il fallait que je détecte quelles formes étaient dans l’intersection entre ma boîte de sélection et mes formes.

J’ai donc commencé avec un hitTestObject() entre ma box de sélection et chacune de mes formes. Le seul problème est que hitTestObject() fait la vérification sur les « bounds » des formes, c’est à dire l’enveloppe des objets. Pour un polygone un peut complexe, cela revenait donc à faire un test de collision entre 2 Rectangle (ma box de sélection et l’enveloppe de ma géométrie). Ce test n’était donc pas bon puisque s’il prenait dans sa sélection une partie de l’enveloppe où il n’y a pas de géométrie, le test renvoyait true.

La méthode hitTestPoint() elle, permet de mettre un flag qui va permettre de faire la vérification sur les pixels ou sur la BoundingBox. C’est un peu ce que j’aurai voulu avoir sur un hitTestObject() mais la c’est sur le Point donc cela faisait trop de calculs/boucles pour détecter une simple collision. Après quelques recherces, je suis tombé sur la classe HitTest de tink.ws, apparemment issu du travail de Grant Skinner.

Cette classe contient 3 méthodes static permettant de faire 3 types de détection de collision en AS3. Pour ma part, j’ai utilisé la méthode  complexHitTestObject() qui correspondait exactement à ce que je recherchais :) . Voila, ça pourrait être utile à quelqu’un donc je partage ce lien très utile.

Article sur le blog de l’auteur de la classe HitTest

Télécharger la classe HitTest.as

ComplexHitTestObject example

IntersectionRectangle example

ComplexIntersectionRectangle example