If you're seeing this message, it means we're having trouble loading external resources on our website.

Si vous avez un filtre web, veuillez vous assurer que les domaines *. kastatic.org et *. kasandbox.org sont autorisés.

Contenu principal

Collisions avec les bouts de bois

Notre castor arrive à sauter. Les bouts de bois s'affichent. Il nous reste juste à connecter les deux ensemble. Nous souhaitons savoir quand notre castor réussit à passer sur un bout de bois, pour pouvoir compter cela comme une collecte réussie. Ce qui veut dire qu'il nous faut faire un test basique de collision entre les deux objets. Il y a plein d'endroits où programmer cette fonctionnalité, étant donné qu'elle intervient sur deux objets (comme fonction globale, comme méthode sur l'objet Stick (Bout de bois) ou comme méthode sur l'objet Beaver (Castor)). Codons-la pour l'instant dans le castor :
Beaver.prototype.checkForStickGrab = function(stick) {
     // si le castor est sur un bout de bois, faire quelque chose
};
Dans cette fonction, il nous faut tout d'abord écrire une condition, qui sera vérifiée si le castor et le bout de bois entre en collision, et seulement dans ce cas-là. Nous pourrions la rendre complexe, ou stricte, en se basant sur les coordonnées des mains du castor, par exemple, mais faisons simple pour le moment. Ils "entrent en collision" si :
  • La coordonnée x du centre du bout de bois est située entre les bords gauche et droit du castor.
  • La coordonnée y du centre du bout de bois est située entre les côtés haut et bas du castor.
Le bout de bois est dessiné en utilisant la fonction rect, donc, typiquement, cela veut dire que les propriétés x et y représentent les coordonnées du coin supérieur gauche. Cependant, pour simplifier le calcul de la collision, nous changeons le mode pour que le rect soit dessiné à partir du centre :
rectMode(CENTER);
rect(this.x, this.y, 5, 40);
L'image du castor est aussi dessinée, par défaut, à partir du coin supérieur gauche, mais nous allons conserver ce mode, car il fonctionne bien pour notre calcul. Pour tester la première condition, sur la coordonnée x, nous pouvons faire un test comme celui-ci, dans lequel nous testons si la coordonnée x du bout de bois est plus grande ou égale au côté gauche (x) du castor et plus petite ou égale au côté droit (x + 40) du castor :
stick.x >= this.x && stick.x <= (this.x + 40)
Pour tester la position y, nous pouvons faire un test similaire, dans lequel nous allons vérifier si la coordonnée y du bout de bois est plus grande ou égale au haut du castor (y) et plus petite ou égale au bas du castor (y + 40) :
stick.y >= this.y && stick.y <= (this.y + 40)
Maintenant, que devons nous faire, une fois que nous avons détecté une collision entre le castor et le bout de bois ? Nous souhaitons, de fait, supprimer le bout de bois de l'écran pour prévenir toute collision future. Un moyen simple pour faire cela est de pousser simplement le bout de bois hors de l'écran, en modifiant sa coordonnée y :
stick.y = -400;
Dans le même temps, nous souhaitons nous souvenir du nombre de bouts de bois que le castor a "attrapés". Nous incrémentons donc la propriété interne sticks (bouts de bois) :
this.sticks++;
Enfin, il nous faut appeler cette méthode au moment opportun. Que pensez-vous de la mettre juste après avoir dessiné chaque bout de bois ?
 for (var i = 0; i < sticks.length; i++) {
    sticks[i].draw();
    beaver.checkForStickGrab(sticks[i]);
    sticks[i].x -= 1;
 }
Et voici le tout rassemblé. Testez. Quand vous sautez sur les bouts de bois, ils disparaissent !

Vous souhaitez rejoindre la discussion ?

Vous comprenez l'anglais ? Cliquez ici pour participer à d'autres discussions sur Khan Academy en anglais.