De Scratch Wiki en français
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
ets'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
ets'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