De Scratch Wiki en Français


La gravité



Introduction

La gravité est une force physique présente dans tout l'univers s’exerçant sur chaque corps ayant une masse. Ce corps est attiré et attire d'autres corps (ayant également une masse) plus ou moins fort en fonction de la différence de leurs masses et de la distance qui les sépare.

Ex. La Terre attire toutes les créatures vers son centre (c'est pour cela que l'on retombe quand on saute). La Lune attire l'eau des mers et océans, ce qui provoque les marées, etc...

On peut facilement reproduire ce phénomène sur Scratch en cas de besoin, pour certains type de jeu par exemple. On retrouve notamment la gravité dans de nombreux projets du type "platformer". Cette partie importante dans la physique peut même s’avérer être une composante primordiale sur Scratch dans le gameplay d'un jeu de plateformes, par exemple.

Il est avant tout nécessaire de redéfinir la manière dont l'on contrôle la position d'un lutin.

En effet, des blocs de mouvement sont implémentés dans scratch pour permettre une meilleur accessibilité aux débutants. Nous allons apprendre à nous en servir et à créer nos propres blocs pour comprendre et reproduire le plus fidèlement la gravité dans Scratch.

Les coordonnées (X,Y,Z)

Les 3 axes des 3 dimensions

La position d'un lutin peut être définie dans l'espace par des coordonnées de variables x, y et z. Ces variables sont représentatives de la position dans les 3 dimensions que compte l'espace.

  • La variable x, représente la position sur l'axe des abscisses (axe horizontal).
  • La variable y, représente la position sur l'axe des ordonnées(axe vertical).
  • La variable z, représente la position sur l'axe de la cote (axe de profondeur).

Le dernier axe, la cote n'est pas présent sur Scratch. En effet, la scène de l'éditeur est un plan en deux dimensions, pas de place pour la 3ème...

La scène sera donc caractérisée par un axe x et un axe y.

Dans un jeu où la gravité intervient, une force (en physique, mais un script de déplacement dans Scratch) fera se déplacer un objet (un lutin) dans une direction (horizontale ou verticale). Le lutin sera donc déplacé vers un axe (x ou y) à une certaine vitesse pour arriver à un point précis.

La vitesse et l'accélération

La vitesse en fonction du temps (accélération)
La distance en fonction du temps (accélération)

En physique la gravité est considérée comme une accélération. Plus l'objet/mobile est haut, plus il aura le temps de tomber plus vite dans sa chute. Sa vitesse augmentera de fonction croissante et régulière tandis que la distance que l'objet parcourra durant sa chute sera exponentielle (on peut le matérialiser par un courbe qui augmente de plus en plus).

La notion d'accélération correspond à la valeur que l'on ajoutera à la variable "vitesse", qui fera glisser le lutin ver le bas (ou autre direction si la gravité ne s'applique pas vers le bas). Chaque instant, la vitesse de chute du lutin sera augmentée de "valeur de accélération". Le lutin tombera de "valeur de vitesse" cases en "temps" unités de temps.

L'accélération sera exprimée en [m/s²]. La vitesse en [m/s] Le temps en [s]

Par exemple, sur terre, l'accélération est de 9,81 [m/s²]. Donc chaque objet qui n'est pas retenu augmentera sa vitesse de chute de 9,81 [m/s] chaque seconde.

C'est donc avec les variables de vitesse et d'accélération que le Scratcher pourra contrôler le déplacement des lutins.







Influence des variables

Une valeur positive de la variable qui représentera l'accélération (verticale) se traduira par un déplacement vers le bas.

En contre partie, une valeur négative se traduira par un déplacement vers le haut.

Autrement, une valeur nulle dans la variable impliquera une immobilité verticale.

Reproduire la gravité dans Scratch

1. Le moyen le plus simple

La gravitation se traduit par un mouvement permanent du lutin vers le centre de l'astre sur lequel il se trouve (sur Scratch, c'est vers le bas de la scène, le sol ou le plancher des vaches, appelez-le comme vous voulez...).

On peut donc s'approcher d'une sorte de gravité en faisant constamment descendre le lutin vers ce sol.

Pratiquement:

1. Créer un lutin sol.

2. Mettre le script 1 ou 2 dans le lutin qui doit tomber.

Moyen 1:

Avec un lutin appelé "sol".

quand le drapeau vert pressé
répéter indéfiniment
    attendre jusqu’à <non <[sol v] touché?>>
    répéter jusqu’à <non <[sol v] touché?>>
        ajouter (2) à y
    end
    répéter jusqu’à <[sol v] touché?>
        ajouter (-2) à y
    end
end

Moyen 2:

Avec les blocs de couleur (si votre sol est noir).

quand le drapeau vert pressé
répéter indéfiniment
    attendre jusqu’à <non <couleur [#000000] touchée?>>
    répéter jusqu’à <non <couleur [#000000] touchée?>>
        ajouter (2) à y
    end
    répéter jusqu’à <couleur [#000000] touchée?>
        ajouter (-2) à y
    end
end

2. Gravité réaliste

La gravité est, comme je l'ai expliqué plus haut, en réalité, une accélération, et donc une modification de la vitesse en fonction du temps. On peut obtenir une chute plus fluide et réaliste en ajoutant une valeur négative à la vitesse à chaque instant en cas de chute.

Cette valeur doit être un multiple de 9.81 (ce qui correspond à l'accélération terrestre de 9.81 [m/s²]).

Pour plus de fluidité, on n'actualisera pas la vitesse toute les 1 [s] mais un certain nombre de fois par seconde.

On peut actualiser la vitesse 10x par seconde. Il faudra donc augmenter la vitesse de ("force de gravité"/10).

En effet cette valeur correspond à l’accélération subie en un dixième de seconde, or 10 (nombre de fois actualisés par seconde) x 9,81[m/s²] (valeur de l'accélération) / 10 (Division pour équilibrer) = 9,81.

Le tour est joué!

Pratiquement:

1. On crée 3 variables ("accélération", "vitesse" et "diviseur").

2. Mettre le script dans le lutin qui doit tomber.

quand le drapeau vert pressé
mettre [diviseur v] à [10]
mettre [vitesse v] à [1]
mettre [accélération v] à [9.81]
répéter indéfiniment
    répéter jusqu’à <couleur [#000000] touchée?>
        glisser en ((1) / (diviseur)) secondes à x: (abscisse x) y: ((ordonée y) - ((vitesse) / (diviseur)))
    end
    mettre [vitesse v] à [1]
    répéter jusqu’à <non <couleur [#000000] touchée?>>
        ajouter (1) à y
    end
end

quand le drapeau vert pressé
répéter indéfiniment
    si <non <couleur [#000000] touchée?>> alors
        attendre ((1)/(diviseur)) secondes
        ajouter à [vitesse v] ((accélération)/(diviseur))
    sinon
        mettre [vitesse v] à (0)
end
Cet article fait partie de la catégorie des tutos
Tous les articles de cette catégorie: