Plus facile à lire avec un fond crème, une teinte, plus de contraste ou un texte plus grand ? Choisissez vos couleurs et votre texte, une fois pour toutes les pages.

Leçon gratuite

Les bases de la boucle de jeu

La leçon complète est à lire ici. Créez un compte gratuit pour la pratiquer dans un labo en direct.

Labo de conteneurs13 min de lecture7 commandes

Un jeu est une boucle

Pense à un folioscope. Chaque page est une image, et en les faisant défiler on donne l'impression que ça bouge. Un jeu fonctionne pareil : soixante fois par seconde, il calcule où se trouve chaque chose, dessine une image, puis recommence. Catch the stars est un petit jeu de ce genre. Des étoiles tombent du haut, tu fais glisser une boîte en bas pour les attraper, et tu perds une vie pour chaque étoile qui passe.

À la fin de cette leçon

Remarque

Je peux dire ce que fait une boucle de jeu à chaque image, et vérifier la gravité et les collisions d'un jeu avec un court script.

Mots clés

  • Image (frame) : une vue du jeu, dessinée de nombreuses fois par seconde.
  • Boucle de jeu : le code qui s'exécute une fois par image : mise à jour, puis dessin.
  • Constante : un nombre nommé en haut du code, comme GRAVITY, que tu changes à un seul endroit.
  • Gravité : un nombre ajouté à la vitesse d'un objet qui tombe, à chaque image.
  • Collision : deux objets qui se touchent, repérés en comparant leurs boîtes.
  • État du jeu : ce dont le jeu se souvient, comme le score et les vies.

Pour commencer : ce que tu sais déjà

Remarque

Réponds dans ta tête. 1. Quand on lâche une balle, tombe-t-elle à la même vitesse jusqu'en bas ? 2. Comment saurais-tu que deux boîtes dessinées sur une feuille se chevauchent ? 3. Que voudrais-tu qu'un jeu t'affiche quand tu as perdu ? Réponses : non, elle accélère ; regarder si l'une commence avant que l'autre finisse, en largeur et en hauteur ; un message et un moyen de rejouer.

Avant de commencer

Remarque

Appuie sur Démarrer le lab dans la barre en haut de la leçon et attends qu'il indique qu'il est en marche. Il y a un seul conteneur, jupyter, et le terminal atteint son Python avec docker exec jupyter, qui lance une commande à l'intérieur. Il a deux liens. JupyterLab, le premier, est l'éditeur, sur le port 8888. Preview (l'aperçu), le second, est le jeu lui-même, sur le port 8000 : ouvre-le dans un onglet de ton navigateur et fais une partie maintenant. Chaque bouton Exécuter ci-dessous tape sa commande dans le terminal de ton lab, l'une après l'autre, dans la même session. Pour suivre les commandes ou taper les tiennes, appuie sur Ouvrir le terminal (nouvel onglet) dans la barre.

Un jeu, ce sont quelques fichiers simples

ls game liste les trois fichiers du jeu : index.html pour la page, style.css pour l'aspect et game.js pour les règles. La deuxième commande affiche leur taille : 667, 442 et 4399 octets, 5508 en tout. Presque tout le jeu est dans game.js. Il n'y a ni moteur ni bibliothèque, seulement ce que le navigateur a déjà.

Commande
docker exec jupyter ls game

Affiché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.

Commande
docker exec jupyter python3 steps/sizes.py

Affiché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.

La boucle de jeu

Le script lit game.js et affiche les constantes nommées en haut : GRAVITY vaut 0.15, PLAYER_SPEED vaut 6 et SPAWN_EVERY vaut 50, soit une nouvelle étoile toutes les 50 images. Il liste ensuite les fonctions. Deux comptent le plus. update déplace tout et regarde ce qui s'est passé, et draw peint l'image. La fonction loop appelle les deux, puis demande au navigateur de la rappeler pour l'image suivante, avec requestAnimationFrame. Cet appel sans fin est la boucle de jeu.

Commande
docker exec jupyter python3 steps/loop.py

Affiché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.

Vérifie

Astuce

Que fait la boucle à chaque image, et quelle constante règle la fréquence des nouvelles étoiles ? Réponse : elle met le jeu à jour puis le dessine ; SPAWN_EVERY.

Des constantes et un tableau de niveaux

Un bon jeu range ses nombres là où on les trouve. LEVELS est un tableau de données : quatre lignes, Drizzle, Shower, Storm et Meteors, qui commencent aux scores 0, 5, 12 et 20. Chaque ligne modifie les nombres de base, et le script calcule le résultat : la gravité passe de 0.150 à 0.360 et l'écart entre deux étoiles passe de 50 images à 25. Le jeu devient donc plus difficile en changeant des données et pas du code. Essaie : change GRAVITY dans game.js, enregistre, relance le script et joue dans Preview.

Commande
docker exec jupyter python3 steps/levels.py

Affiché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.

La gravité est un nombre ajouté à chaque image

La gravité ne déplace pas une étoile à elle seule. À chaque image, elle ajoute un peu à la vitesse de l'étoile, puis la vitesse déplace l'étoile. Le script suit une étoile pendant dix images à partir de la constante de game.js : la vitesse augmente de 0.15 à chaque image, jusqu'à 1.50, et l'étoile est tombée de 8.25 pixels en tout. Chaque image fait un pas plus grand que la précédente, d'où l'impression qu'une étoile accélère en tombant.

Commande
docker exec jupyter python3 steps/fall.py

Affiché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.

Une collision est une question sur deux boîtes

Pour attraper une étoile, le jeu demande si deux boîtes se chevauchent. C'est le cas quand chacune commence avant que l'autre finisse, en largeur comme en hauteur. Le script fait le même test en Python sur six paires fixes : des boîtes qui se chevauchent et une boîte dans une autre donnent True, des boîtes éloignées donnent False, et celles qui ne partagent qu'un bord aussi. Le jeu fait ce test pour chaque étoile à chaque image.

Commande
docker exec jupyter python3 steps/collide.py

Affiché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.

Servir le jeu, et y jouer

Preview est un simple serveur de fichiers. Le script lui demande la page, le script et la feuille de style, comme le fait un navigateur, et chacun répond 200. Rien dans le lab ne peut jouer à ta place, car il n'y a pas de navigateur dedans. Ouvre Preview dans ton propre onglet : utilise les flèches gauche et droite, ou les boutons, pour glisser la boîte. Après trois étoiles manquées, le jeu affiche Game over, et Espace ou Restart relance une partie.

Commande
docker exec jupyter python3 steps/serve.py

Affiché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.

Une erreur fréquente

Attention

Beaucoup pensent qu'un nombre plus grand rend toujours un jeu meilleur. Ce n'est pas le cas. Si GRAVITY est trop grand, les étoiles tombent plus vite que personne ne peut réagir, et si PLAYER_SPEED est trop petit, la boîte n'arrive pas à se placer dessous. Change un seul nombre à la fois, joue, et note ce que tu as vu avant d'en changer un autre.

Les mêmes vérifications dans un notebook

Ouvre JupyterLab depuis la barre et double-clique sur start.ipynb. Ses cellules lisent les constantes, font le test de chevauchement sur deux boîtes et demandent la page à Preview. Clique sur une cellule et appuie sur Maj et Entrée pour l'exécuter. La dernière cellule est faite pour ton propre changement : change GRAVITY, enregistre, et calcule où se trouve une étoile après dix images.

Vérification finale

Astuce

Réponds sans revenir en arrière. 1. Quels deux travaux la boucle de jeu fait-elle à chaque image ? 2. Que change la gravité à chaque image, la position ou la vitesse ? 3. Quand deux boîtes se chevauchent-elles ? 4. Pourquoi un tableau de niveaux vaut-il mieux que d'écrire chaque niveau dans le code ? Réponses : mettre à jour et dessiner ; la vitesse, et la vitesse déplace ensuite l'étoile ; quand chacune commence avant que l'autre finisse, en largeur et en hauteur ; on change les données et pas le code.

Pour les enseignants

Astuce

Cette leçon est un petit exemple de leçon travaillée dans un lab : les étapes et les boutons Exécuter sont la leçon, et le lab est la copie de chaque élève. Le lab est un seul service, JupyterLab avec une copie en direct d'un petit jeu, et rien ici ne se corrige tout seul : l'élève rend sa propre version des trois fichiers de game, téléchargés depuis JupyterLab, et une phrase sur un nombre qu'il a changé et son effet. Points clés : 1. Un jeu est une boucle de mise à jour et de dessin. 2. La gravité change la vitesse, et la vitesse change la position. 3. Une collision est un test sur des boîtes, et les nombres vont dans des constantes nommées et des tableaux. Erreur fréquente : changer plusieurs nombres à la fois. Matériel : le lab et un navigateur, car le lab n'en a pas et le jeu se joue dans celui de l'élève. Conseil : demandez aux élèves de prévoir l'effet d'un changement avant de recharger. Le jeu et les scripts sont écrits à partir d'un texte fixe, donc chaque copie donne les mêmes nombres, mais l'endroit où démarre une étoile est aléatoire. Copiez-la dans votre propre module et modifiez-la, ou créez-en une de zéro avec le menu Lab du créateur de leçons.

À propos de ce labo et de sa source: Lab de développement de jeux : boucle de jeu, gravité et collisions dans le navigateur

Vous enseignez à une classe ? Proposez ces leçons à vos élèves avec correction et un labo pour chaque élève.