Comment un jeu repère une collision
Une collision, c'est le moment où deux objets d'un jeu se touchent : une balle frappe un mur, un joueur ramasse une pièce. Un jeu ne voit pas les dessins, il compare des nombres.
Savoir écrire ce test permet de faire attraper une étoile, perdre une vie ou rebondir une balle, sans jamais lire l'écran.
À la fin de cette leçon
Remarque
Je peux écrire le test qui dit si deux rectangles ou deux cercles se touchent.
Mots clés
| Mot | Ce que ça veut dire | Exemple |
|---|---|---|
| Collision | le moment où deux objets se touchent | |
| Rectangle englobant | la boîte, alignée sur les axes, qui entoure un objet | |
| Chevauchement | une partie commune entre deux formes | |
| Rayon | la distance du centre d'un cercle à son bord | 5 |
| Distance | la longueur entre deux points | 5 |
| Axe | une direction de l'écran : x en travers, y vers le bas |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Chaque objet est une boîte de quatre nombres
Dans un jeu, chaque objet a une boîte rectangulaire. Quatre nombres la décrivent : x et y pour le coin en haut à gauche, puis la largeur et la hauteur.
Sur l'écran, y augmente vers le bas. Le coin droit de la boîte est à x + largeur, et son bord bas est à y + hauteur.
Deux boîtes se chevauchent sur les deux axes
Deux boîtes se touchent quand leurs intervalles se recouvrent sur les deux axes à la fois. Sur l'axe x, chacune doit commencer avant la fin de l'autre. Sur l'axe y, c'est la même chose.
Si un seul axe est séparé, les boîtes sont séparées. Des boîtes qui partagent seulement un bord ne se chevauchent pas.
Exemple : le test de chevauchement
<pre id="sortie"></pre>Avant de lancer les Run
Remarque
Démarrez le labo et ouvrez le terminal. Le script collide.py teste six paires de boîtes. Il écrit des mots anglais : apart veut dire séparées, overlapping veut dire qui se chevauchent, et il répond True ou False.
Tester six paires de boîtes
docker exec jupyter python3 steps/collide.pyAffiché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.
Calculer un carré de distance
docker exec jupyter python3 -c "print(3 ** 2 + 4 ** 2)"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.
Ce que montrent les six paires
Le premier Run écrit six lignes. Les paires overlapping, one inside the other et one corner inside donnent True. Les paires apart, edges touching et same column, far apart donnent False.
Notez le cas où les bords se touchent : c'est False. Le jeu du labo compte une collision seulement quand les boîtes se recouvrent un peu.
Deux cercles : comparer la distance aux rayons
Pour un cercle, la boîte est trop large aux coins. On compare plutôt la distance entre les centres à la somme des rayons. Deux cercles se touchent si la distance est plus petite que cette somme.
Pour éviter une racine carrée, on compare les carrés : dx² + dy² doit être plus petit que (r1 + r2)². Le second Run donne 25, le carré de la distance 5 pour un décalage de 3 et 4.
Exemple : trois paires de cercles
| Cercle 1 (x, y, rayon) | Cercle 2 (x, y, rayon) | dx² + dy² | (r1 + r2)² | Collision |
|---|---|---|---|---|
| (0, 0, 5) | (8, 0, 5) | 64 | 100 | oui |
| (0, 0, 5) | (10, 0, 5) | 100 | 100 | non, ils se frôlent |
| (0, 0, 2) | (6, 8, 3) | 100 | 25 | non |
Les cellules que les étudiants remplissent restent vides dans cet aperçu.
Une erreur fréquente
Attention
Beaucoup croient qu'il suffit de comparer x pour savoir si deux objets se touchent. Faux : deux objets peuvent avoir le même x et être très loin l'un de l'autre en hauteur. Testez toujours les deux axes, et combinez les deux résultats avec un et.