Source: Scratch Wiki en français


Les mouvements fluides


Le mouvement peut souvent être au centre du gameplay d'un jeu, voilà pourquoi obtenir un mouvement fluide peut s'avérer indispensable, lorsqu'il s'agit de faire déplacer son personnage, un ennemi ou encore bien d'autres choses.

Avoir un jeu qui "lag" (hachures ou coupures, voire blocages et autres problèmes) n'est jamais quelque chose de très amusant, et ceux qui jouent sur ordinateur portable comprennent bien de quoi je veux parler. Les causes de ces dérangements sont multiples : jeu mal programmé, machine trop peu puissante, mauvaise connexion internet, etc...

Info
 Info :
Le tutoriel suivant est dédié à un mouvement unidimensionnel (sur l'axe X dans ce cas), voir le tutoriel sur la gravité pour plus de détails sur les mouvements sur l'axe y.

Les variables

Pour obtenir un mouvement fluide, il faudra créer les quelques variables suivantes :

(Position)

dont les unités sont les [m].

(Vitesse)

dont les unités sont les [m/s].

(Vitesse Maximale)

dont les unités sont les [m/s].

(Accélération)

dont les unités sont les [m/s²].

(Frottements)

qui s'exprimme en [%/Calc].

(Dt)

dont les unités sont les [s] (Le D remplace Δ (Delta), qui symbolise une différence).

Rôle des variables

(Position)

Définit la position de l'objet en mouvement en exprimant sa distance par rapport au centre du "monde" (dans la vie réelle), ou avec la scène (dans Scratch).

(Vitesse)

Variable qui définit la vitesse de l'objet à un instant T, c'est sa vitesse instantanée.

(Vitesse Maximale)

Constante définie par l'utilisateur, décrit la vitesse maximale pouvant être atteinte par un objet quand il est soumis à un force (lors d'une chute ou d'un mouvement).

(Accélération)

Constante définie par l'utilisateur, définit le dynamisme du mouvement, une valeur élevée produira un mouvement dynamique, une valeur faible un mouvement plus "lourd". Chaque seconde, cette valeur sera ajoutée à la vitesse pour obtenir une bonne accélération ou décélération.

(Frottements)

Constante définie par l'utilisateur, correspond à l'interaction entre le sol, l'air et l'objet. Une valeur faible donne l'impression d'un sol rugueux, une valeur élevée celle d'un sol glissant. (comprise entre 0.1 et 99.9). Cette variable prend une valeur plus élevée quand le personnage ne touche pas le sol et correspond aux frottements de l'air (attention, il faudra aussi l'appliquer à la variable Vy)

(Dt)

Constante définie par l'utilisateur, interne à la simulation, correspond à la "découpe" des calculs. Une valeur proche de 0 donnera des résultats plus réalistes mais demandera plus de ressources à l'ordinateur (la variable est souvent comprise entre 0.1 et 0.01).

Danger
 Danger :
Cette variable ne doit jamais être égale à 0 ! Eh oui, comment voulez-vous diviser un nombre par 0, cela ferait alors partir votre projet complètement en vrille.

Les formules

Après avoir mis ces scripts quelque part avec un élément déclencheur (bloc évènement jaune), vos variables devraient bien se comporter si vous les avez configuré correctement.

répéter indéfiniment
mettre [Vitesse v] à (((Vitesse) + ((Accélération) * (Dt))) * (Frottements))
si <(Vitesse) > (Vitesse Maximale)> alors
mettre [Vitesse v] à (Vitesse Maximale)
end
si <(Vitesse) < ((Vitesse Maximale) * (-1)) > alors
mettre [Vitesse v] à ((-1) * (Vitesse Maximale))
end
mettre [Position v] à ((Position) + ((Vitesse) * (Dt)))
attendre (Dt) secondes
end

Interprétation

Pour interpréter graphiquement la position calculée, il suffit de placer le bloc

mettre x à(Position)

Pour contrôler le mouvement, il faut contrôler la variable Accélération en lui donnant différentes valeurs :

  • Arrêter de se déplacer : Accélération = 0
  • Se déplacer à droite : Accélération = A
  • Se déplacer à gauche : Accélération = -A

(Avec A correspondant à la valeur de l’accélération décrite dans la partie Rôle des variables)

Voilà le script à ajouter où vous voulez, tant qu'un bloc d’événement (jaune) vient au-dessus.

répéter indéfiniment
si <touche [flèche droite v] pressée?> alors 
mettre [Accélération v] à [A]
sinon
si <touche [flèche gauche v] pressée?> alors 
mettre [Accélération v] à [-A]
sinon
mettre [Accélération v] à [0]
end
end
end

Complément

Si le jeu est en "vue de dessus" (snake par exemple), on peut facilement adapter le script pour permettre un mouvement sur l'axe Y, pour cela on décompose la variable

(Position)

en deux variables,

(Position X)
(Position Y)

et en ajoutant une variable

(Rotation)

Il faut pour cela remplacer la ligne

mettre [Position v] à ((Position) + ((Vitesse) * (Dt)))

par deux lignes

mettre [Position X v] à ((Position X) + (([sin v] de (Rotation)) * ((Vitesse) * (Dt)))
mettre [Position Y v] à ((Position Y) + (([cos v] de (Rotation)) * ((Vitesse) * (Dt)))

La variable "Rotation"

Elle correspond à l'orientation de l'objet sur la scène, et décrit donc la direction vers laquelle l'objet accélère, elle doit être comprise entre 0 et 360.

Pour contrôler le mouvement, il faut contrôler la variable Accélération et la variable Rotation :

  • Accélérer : Accélération = A
  • Arrêter de se déplacer : Accélération = 0
  • S'orienter dans l'espace : Rotation comprise entre 0 et 360

Pour interpréter graphiquement la position calculée, il suffit de placer le script suivant :

répéter indéfiniment
aller à x: (Position X) y: (Position Y)
end
Cet article fait partie de la catégorie des tutos
Tous les articles de cette catégorie :