Création de jeux (5eme partie) : détection des collisions

Une bonne détection des collisions est souvent ce qui fait la différence dans un jeu !


Il existe d’innombrables façon de détecter les collisions, la plus simple est d’utiliser la méthode hitTestObject() mais celle ci pose un gros probleme car la détection ne ce fait pas sur le contour réel de l’objet mais sur sa « boite englobante » (bounding box ou hit box).
Voici quelques images pour bien comprendre le principe de la boite englobante et son probleme :

L’objet à tester pour collision est en rouge et sa boite englobante en bleue … on remarque tout de suite que la surface qui va déclencher le test de collision est beaucoup plus grande que l’objet lui même et ne correspond en rien à la forme de l’objet.

La même chose avec un cercle :

A partir de ces observations on peut être tenté de ce limiter à des objets de forme rectangulaire pour éviter ce probleme, ex :

Le probleme disparait (pour l’instant).

Si on applique une rotation de 45° à notre rectangle :

La boite ne tourne pas avec l’objet et on retrouve le même probleme que précédemment.

Pourtant le hitTestObject() n’est pas à jeter, il peut être utile dans les jeux ou une approximation suffit.


Voici 2 exemples utilisant hitTestObject() pour détecter toutes les collisions :

1-Exemple à ne pas reproduire.
J’ai utilisé le tuto N°4 en limitant la vitesse de déplacement du véhicule et en ajoutant 5 formes sur la scene (4 murs et la boule au centre), j’ai dessiné sur la scene la zone qui représente la boite de la boule rouge.
Les touches fléchés permettent de déplacer le véhicule.

Difficile de ne pas remarquer l’énorme erreur de détection quand le véhicule arrive sur le cercle avec un angle approchant les 45°.

2-Exemple valable.
Utilisant le tuto N°2 (un canon tir un boulet sur une cible) :

La vitesse de déplacement du boulet est suffisante pour masquer l’erreur de détection.
Comme dans cet exemple les 2 objets à tester sont des cercles, un simple calcul mathématique basé sur la distance entre les 2 centres que l’on soustrait aux rayons aurait donné un résultat parfait pour détecter la collision ((distance – (r1+r2)) <= 0).


Une chose importante à savoir avec la détection de collision que ce soit avec hitTestObject(), des formules mathématique ou une autre solution est lié directement à la vitesse de l’objet en déplacement !
Imaginez une bille de 1px de diamètre ce déplaçant horizontalement de 20px à chaque image et un « mur » de 5px sur son trajet, il est tout a fait possible (même grandement probable) que la collision ne soit jamais détecté car la bille n’a pas été testé sur le mur.

Voici une image pour bien comprendre ce probleme (la bille en rouge avec ses positions sur 4 frames) (Le mur en orange) :

Sur la frame N°3 la bille est placé avant le mur et sur la N°4 la bille est aprés, la détection ne peut pas fonctionner.

Pour régler ce probleme il faut limiter la vitesse de déplacement ou augmenter l’épaisseur des murs ou faire des tests sur des positions intermédiaires (plus de hitTestObject) ou alors utiliser un vrai moteur physique (Box2d/APE).

Laisser un commentaire

*