De Scratch Wiki en français

(Automated edit: fixed 1 style guideline)
(Applications pratiques)
 
(6 versions intermédiaires par 5 utilisateurs non affichées)
Ligne 2 : Ligne 2 :
 
Idée : énergie perdue = dommage infligés au personnage
 
Idée : énergie perdue = dommage infligés au personnage
 
Tuto de petite taille -->
 
Tuto de petite taille -->
----
+
{{Titre|Rebonds}}{{AFinir}}
<div style="margin: 0.5em; padding: 0.25em 0.9em;"><center><span style="font-size:2em">'''Rebonds'''</span></center></div>
 
----
 
  
==Introduction==
+
La gestion des rebonds est directement inspirée de la [[Collisions et hitbox (tutoriel)|gestion des collisions]], il vous sera donc aisé d'en comprendre les subtilités si vous avez suivi le tutoriel sur les collisions & hitbox.
 
 
La gestion des rebonds est directement inspirée de la [[Tutoriel collisions et hitbox|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==
 
==Nature d'un rebond==
  
Un rebond est une collision dont les propriétés affectent activement le déplacement du lutin. Ainsi une balle qui rebondit ne s’arrête pas immédiatement au contact du sol.
+
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==
 
==Formule du rebond==
Ligne 18 : Ligne 15 :
 
===Variable===
 
===Variable===
  
Il faudra créer Une variable supplémentaire, qui est le coefficient de restitution, exprimé en %. Il est propre au personnage ou varie en fonction
+
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.
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"
+
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.
 
K correspond au pourcentage de la vitesse qui sera restituée à l'objet qui rebondit.
Ligne 27 : Ligne 23 :
 
===Formule===
 
===Formule===
  
Si l'objet touche le sol ou le plafond, il faut modifier Vy comme il suit
+
Si l'objet touche le sol ou le plafond, il faut modifier la vitesse verticale Vy comme suit :
  
'''Mettre Vy à (-1*k*Vy)'''
+
<scratchblocks>
 +
mettre [vy v] à (((-1) * (k)) * (vy))
 +
</scratchblocks>
  
Si l'objet touche un mur, il faut modifier Vx comme il suit
+
Si l'objet touche un mur, il faut modifier la vitesse horizontale Vx comme suit :
  
'''Mettre Vx à (-1*k*Vx)'''
+
<scratchblocks>
 +
mettre [vx v] à (((-1) * (k)) * (vx))
 +
</scratchblocks>
  
 
==Conjugaison==
 
==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 [[La gravité (tutoriel)|gravité]].
  
 
(Cf tutos précédents)
 
(Cf tutos précédents)
  
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é
+
==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 <sub><sb>avancer de () pas</sb></sub> et <sub><sb>s'orienter à ()</sb></sub> pour diriger votre sprite, votre script devrait ressembler à ceci :
 +
<scratchblocks>
 +
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
  
==Cas particuliers==
+
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
 +
</scratchblocks>
 +
 
 +
* Si vous utilisez les les variables <sb>(Vx)</sb> et <sb>(Vy)</sb> pour diriger votre sprite, votre script devrait ressembler à ceci :
 +
<scratchblocks>
 +
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
 +
</scratchblocks>
 +
===Murs horizontaux===
 +
* Si vous utilisez les blocs <sub><sb>avancer de () pas</sb></sub> et <sub><sb>s'orienter à ()</sb></sub> pour diriger votre sprite, votre script devrait ressembler à celui des murs verticaux du paragraphe précédent avec pour seule modification :
 +
<scratchblocks>
 +
s'orienter à ((180)-(direction)) //formule de changement de direction contre un mur horizontal
 +
</scratchblocks>
 +
 
 +
* Si vous utilisez les les variables <sb>(Vx)</sb> et <sb>(Vy)</sb> pour diriger votre sprite, votre script devrait ressembler à celui des murs verticaux du paragraphe précédent avec pour seules modifications :
 +
<scratchblocks>
 +
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
 +
</scratchblocks>
 +
==Cas complexes==
 +
===Murs obliques===
 +
===Rebonds aléatoires===
  
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 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.
 
 
{{tuto}}
 
{{tuto}}
{{Modèle:Enquête}}
 

Version actuelle datée du 27 avril 2021 à 21:07


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 :
Les cookies nous aident à fournir nos services. En utilisant nos services, vous acceptez notre utilisation des cookies.