De Scratch Wiki en français



Rebonds


La gestion des rebonds est directement inspirée de la gestion des collisions, il vous sera donc aisé d'en comprendre les subtilités si vous avez suivi le tutoriel sur les collisions & hitbox.

Théorie

Nature d'un rebond

Un rebond est une collision dont les propriétés affectent activement le déplacement du sprite. Ainsi une balle qui rebondit ne s’arrête pas immédiatement au contact du sol mais ralentit à chaque contact.

Formule du rebond

Variable

Il faudra créer une variable supplémentaire qui est le coefficient de restitution, exprimé en pourcentage. Il est propre au personnage ou varie en fonction de la surface avec laquelle il entre en collision.

Appelons ce coefficient K. Sa valeur est, dans le cas général, comprise entre 0 et 1. Une valeur proche de 1 donnera des chocs très élastiques (balle rebondissante) tandis qu'une valeur proche de 0 donnera un rebond très «rigide».

K correspond au pourcentage de la vitesse qui sera restituée à l'objet qui rebondit.

Formule

Si l'objet touche le sol ou le plafond, il faut modifier la vitesse verticale Vy comme suit :

mettre [vy v] à (((-1) * (k)) * (vy))

Si l'objet touche un mur, il faut modifier la vitesse horizontale Vx comme suit :

mettre [vx v] à (((-1) * (k)) * (vx))

Conjugaison

Ces formules trouvent une application bien plus réaliste si elles sont conjuguées à un système de hitbox, à un système de «frottements», et dans un système de gravité.

(Cf tutos précédents)

Cas particuliers

Les rebonds peuvent parfois «projeter» le personnage (ressort, trampoline). Dans ce cas, soit k doit être supérieur à 1, soit on fixe la valeur Vx et/ou Vy que prendra le personnage après la collision comme constante.

Dans un sens purement physique, k n'est pas réellement supérieur à 1 (cela voudrait dire que l'on crée de l'énergie) mais, lorsqu'on saute sur un trampoline, on fournit de l'énergie avec nos jambes que le trampoline emmagasine puis restitue sous forme de vitesse verticale. Voila pourquoi on à l'impression d’accélérer.

Pratique

Cas simples

Murs verticaux

  • Si vous utilisez les blocs avancer de () pas et s'orienter à () pour diriger votre sprite, votre script devrait ressembler à ceci :
quand le drapeau vert pressé
basculer sur le costume (costume 1 v)
répéter indéfiniment
rebondir si le bord est atteint //pour rebondir sur les bords de la scène
basculer sur le costume (hitbox v) //basculer sur le costume hitbox  qui est plus facile pour gérer les collisions
avancer de (vitesse) pas
contact::custom //on va vérifier et gérer le contact dans le bloc personnalisé ci-dessous exécuté sans rafraichissement d'écran
fin

définir contact //exécuter sans rafraichissement d'écran
si <touche le (mur v)> alors //vérifier si contact
répéter jusqu'à ce que <non<touche le (mur v)>> //en cas de contact, faire reculer le sprite jusqu'à la dernière position avant le contact
avancer de (-1) pas
fin
s'orienter à ((0)-(direction)) //formule de changement de direction contre un mur vertical
mettre [vitesse v] à ((k)*(vitesse)) //pour ralentir ou accélérer le sprite
fin
basculer sur le costume (costume 1 v) //reprendre le costume normal
  • Si vous utilisez les les variables (Vx) et (Vy) pour diriger votre sprite, votre script devrait ressembler à ceci :
quand le drapeau vert pressé
basculer sur le costume (costume 1 v)
répéter indéfiniment
rebondir si le bord est atteint //pour rebondir sur les bords de la scène
basculer sur le costume (hitbox v) //basculer sur le costume hitbox  qui est plus facile pour gérer les collisions
ajouter (Vx) à x
ajouter (Vy) à y
contact::custom //on va vérifier et gérer le contact dans le bloc personnalisé ci-dessous exécuté sans rafraichissement d'écran
fin

définir contact //exécuter sans rafraichissement d'écran
si <touche le (mur v)> alors //vérifier si contact
répéter jusqu'à ce que <non<touche le (mur v)>> //en cas de contact, faire reculer le sprite jusqu'à la dernière position avant le contact
ajouter ((0)-(Vx)) à x
ajouter ((0)-(Vy)) à y
fin
mettre [Vx v] à (((-1)*(k))*(Vx)) //formule de changement de direction contre un mur horizontal avec coefficient de ralentissement ou d'accélération pour la composante abscisse du déplacement
mettre [Vy v] à ((k)*(Vy)) //coefficient de ralentissement ou d'accélération pour la composante ordonnée du déplacement
fin
basculer sur le costume (costume 1 v) //reprendre le costume normal

Murs horizontaux

  • Si vous utilisez les blocs avancer de () pas et s'orienter à () pour diriger votre sprite, votre script devrait ressembler à celui des murs verticaux du paragraphe précédent avec pour seule modification :
s'orienter à ((180)-(direction)) //formule de changement de direction contre un mur horizontal
  • Si vous utilisez les les variables (Vx) et (Vy) pour diriger votre sprite, votre script devrait ressembler à celui des murs verticaux du paragraphe précédent avec pour seules modifications :
mettre [Vx v] à ((k)*(Vx)) //coefficient de ralentissement ou d'accélération pour la composante abscisse du déplacement
mettre [Vy v] à (((-1)*(k))*(Vy)) //formule de changement de direction contre un mur horizontal avec coefficient de ralentissement ou d'accélération pour la composante ordonnée du déplacement

Cas complexes

Murs obliques

Rebonds aléatoires

Cet article fait partie de la catégorie des tutos
Tous les articles de cette catégorie :