Source : Scratch Wiki en français


Collisions & Hitbox

Les interactions entre objets dans Scratch reposent souvent sur la détection de contact ou de collision.
Cette page présente les outils fournis par Scratch ainsi que des méthodes plus avancées utilisant des hitbox et des calculs mathématiques.

Détection de contact

Afin de détecter une collision, il est nécessaire de connaître la position et l’espace occupé par chaque objet.
Scratch propose plusieurs blocs de détection permettant de répondre à ces besoins.

Bloc Explication
<touche le (sprite v)> 
Ce bloc permet de savoir si l'apparence graphique du sprite (costume) se superpose au costume d'un autre objet. Cette fonction s'avère utile pour des collisions simples avec peu d'objets.
<couleur [#ff0000] touchée?>
Ce bloc permet de savoir si le sprite dans lequel le bloc est placé touche une couleur indiquée. Cette fonction s'avère utile pour les collisions avec un même type d'objet (par exemple le sol) qui sera d'une couleur unie.
Attention
 Attention :
Ce bloc ne réagit que si la couleur touchée est exactement la même que celle sélectionnée dans le bloc.
<couleur [#ff0000] touche [#00ff00] ?>
Ce bloc permet de savoir si la première couleur indiquée dans le bloc (la couleur doit être présente dans le sprite) touche la deuxième couleur (qui doit être en dehors du sprite, sur un autre élément).

Hitbox

Hitbox simple

Une hitbox (ou boite de collision en français), est une zone qui peut "détecter un autre objet (et inversement) afin de créer, par exemple, une collision. Il s'agit généralement d'une forme simple (rectangle, ellipse...) englobant au mieux un sprite ou une zone.
La hitbox peut être créée comme :

  • un sprite à part entière
  • ou un costume spécifique d’un sprite existant

On dessine alors une forme pleine (coloriée) aux proportions et formes souhaitées.

Info
 Info :
Le bloc mettre l'effet [fantôme v] à (100) permet de ne pas afficher le sprite tout en laissant la détection possible par un autre sprite, contrairement au bloc Cacher
Attention
 Attention :
Il faut bien positionner le dessin de la hitbox par rapport à la croix repère au centre de la zone de dessin afin qu il se superpose avec les graphismes du sprite.

Pour tester une collision avec une hitbox, on utilise le bloc :

<touche le (hitbox v) ?>

Exemple de script :

mettre l'effet [fantôme v] à (100)
répéter indéfiniment
aller à (sprite à traquer v)
si <touche le (hitbox v) ?> alors
...//action à effectuer
fin
fin

Hitbox avancée

Un sprite peut posséder plusieurs hitbox, chacune correspondant à une zone spécifique :

  • haut,
  • bas,
  • gauche,
  • droite...

Cette technique est couramment utilisée dans les jeux de plateforme, où le comportement diffère selon la zone touchée (sol, mur, plafond).
Chaque hitbox est généralement représentée par un sprite ou un costume distinct.

Collisions

Collision physique

Pour interpréter les collisions dans la physique du jeu il faudra créer des hitbox pour les objets concernés.


Exemple
Un personnage (4 hitbox : haut/bas/gauche /droite), Sol, Plafond, Mur :
  • Si la hitbox droite du personnage touche un mur, il faudra alors annuler sa vitesse x si elle est positive.
  • Si la hitbox gauche du personnage touche un mur, il faudra alors annuler sa vitesse x si elle est négative.
  • Si la hitbox haut du personnage touche un plafond, il faudra alors annuler sa vitesse y si elle est positive.
  • Si la hitbox droite du personnage touche le sol, il faudra alors annuler sa vitesse y si elle est négative.

Ce principe peut être étendu à d’autres interactions :

  • recul après un choc,
  • poussée par un ennemi,
  • explosion,
  • changement de gravité,
  • fin de niveau...

Collisions dynamiques

Une collision peut aussi transmettre une partie de sa vitesse Si l'objet percuté est petit il devra plus accélérer que le gros objet qui le percute ralentit, et inversement (exemple : une grosse bille qui en percute une petite)

Détection mathématique

On peut facilement détecter si un objet se trouve dans un cercle dont on connait le rayon et les coordonnées du centre

Formule

Prenons l' objet A de coordonnées Xa et Ya, ainsi qu'un cercle de rayon R et de coordonées Xc et Yc,

si <([racine v] de((((Xc)-(Xa))*((Xc)-(Xa)))+(((Yc)-(Ya))*((Yc)-(Ya)))))<(R)> alors
...//l'objet A est dans le périmètre du cercle.
fin

Utilisation

Cette méthode peut être utilisée pour :

  • détecter une zone d’attaque ;
  • limiter les déplacements dans un niveau ;
  • créer des murs invisibles ;
  • gérer des zones d’effet.

On peut aussi l'utiliser pour créer un système de murs n'utilisant pas les sprites (et dont l'apparence sera faite par l'outil Stylo)
Il faut pour cela créer 3 listes, (MurX::list), (MurY::list) et (Radius::list)
A chaque actualisation, il faudra parcourir ces listes dans leur intégralité.donc chaque couple d'éléments:

élément (n) de (MurX v)
élément (n) de (MurY v)
élément (n) de (Radius v)

correspond au couple Xc, Yc et R du mur numéro n Chaque élément de ces listes représente le centre et le rayon d’un mur.
À chaque actualisation, le jeu teste si l’objet entre dans l’un de ces périmètres, il faudra donc activer les scripts suivants:

Effacer Tout
répéter (Longueur de[MurX v]) fois
Relever le stylo
Aller à x:(élément (n) de [MurX v]) y:(élément (n) de [MurY v])
Stylo en position d'écriture
fin

Si le sprite se trouve dans un des périmètres, il faudra alors faire reculer le sprite de ce qu'il vient d'avancer pour annuler son déplacement
Ce système est flexible mais peut ralentir le projet si le nombre de zones est élevé, car chaque périmètre est testé à chaque frame. L'actualisation graphique peut elle aussi être lente et nécessiter l'activation du Mode Turbo

Cet article fait partie de la catégorie des tutos
Tous les articles de cette catégorie :
Les témoins (''cookies'') nous aident à fournir nos services. En utilisant nos services, vous acceptez notre utilisation de témoins.