Comment un jeu se souvient de son état
Une machine à états décrit un personnage par les états qu'il peut prendre. Des événements le font passer de l'un à l'autre. Un personnage est au sol, en saut ou en chute, jamais dans deux états à la fois.
Cette manière de penser évite un bug fréquent. Le personnage saute dans les airs, parce que le jeu ne savait pas qu'il y était déjà.
À la fin de cette leçon
Remarque
Je peux décrire un personnage par ses états et écrire la règle qui donne l'état suivant.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| État | ce que le jeu sait à un instant : au sol, en saut, partie terminée | |
| Événement | quelque chose qui arrive : une touche, un choc, un sommet atteint | |
| Transition | le passage d'un état à un autre, quand un événement arrive | |
| Machine à états | la liste des états et des transitions permises | |
| Entrée | ce que le joueur fait au clavier ou à l'écran tactile | |
| Booléen | une valeur vrai ou faux | true |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Un état est ce que le jeu retient
Un jeu garde en mémoire quelques valeurs. Ce sont le score, le nombre de vies, la position du joueur, et un booléen qui dit si la partie est terminée. Ensemble, elles forment l'état du jeu.
À chaque image, la mise à jour lit cet état, le change un peu, puis le dessin le montre. Le jeu ne voit jamais le passé, il ne voit que son état présent.
Une touche change l'état, la boucle le lit
Le clavier prévient le jeu par des événements : une touche est enfoncée, puis relâchée. Le jeu ne bouge pas le personnage à ce moment. Il note seulement dans un booléen que la touche est tenue.
C'est la boucle qui, à l'image suivante, lit ce booléen et déplace le personnage. Ainsi le mouvement reste régulier, même si le clavier répète les événements.
Exemple : noter les touches dans des booléens
<p>Cliquez sur la page, puis tenez la flèche droite.</p>
<p id="sortie">touche tenue : non</p>Avant de lancer les Run
Remarque
Démarrez le labo et ouvrez le terminal. Les deux Run cherchent des mots dans le fichier game.js du jeu « Catch the stars ». Ils écrivent un nombre ou des lignes de code, dont les noms sont anglais : gameOver veut dire partie terminée.
Compter les lignes qui parlent de gameOver
docker exec jupyter grep -c gameOver game/game.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Trouver où gameOver change de valeur
docker exec jupyter grep -n "gameOver = " game/game.jsAffichée ici, non exécutée. Créez un compte gratuit pour appuyer sur Exécuter et la saisir dans le terminal de votre propre labo.
Ce que montre le fichier du jeu
Le premier Run écrit 6 : six lignes du jeu parlent de gameOver. Le second écrit deux lignes. À la ligne 48, gameOver passe à false : c'est le début d'une nouvelle partie.
À la ligne 83, il passe à true : c'est le moment où les vies tombent à zéro. Le jeu a donc deux états, en cours et terminé.
Une machine à états liste les passages permis
Pour un personnage, on écrit chaque état, puis chaque événement qui le change. Au sol, l'appui sur saut mène à l'état en saut. Au sommet, le personnage passe en chute. À l'atterrissage, il revient au sol.
Un événement qui n'est pas prévu pour un état ne fait rien. En chute, appuyer sur saut ne donne pas un second saut.
Une erreur fréquente
Attention
Beaucoup écrivent un booléen par situation : en_saut, en_chute, au_sol. Ils peuvent alors être vrais en même temps, ce qui n'a aucun sens. Utilisez une seule valeur d'état à la fois. Le personnage est dans exactement un état.