[phaser3] modifier la collision entre des objets en cours de jeu

24h pour découvrir le département MMI

[phaser3] modifier la collision entre des objets en cours de jeu

Le mécanisme de collision de Phaser est plus complexe qu’il n’y parait, mais permet de nombreuses possibilités. Dans cet exemple, nous montrons comment faire en sorte de n’activer la collision entre deux objets que si une condition spéciale est remplie. Cela permet par exemple, de ne pas se cogner à une plate-forme, de pouvoir monter dessus en étant en dessous, mais de ne pas tomber une fois dessus.

De base, quand on veut mettre en place une collision entre un personnage player et une plateforme (qui serait dans un groupe platforms par exemple dans create(), on écrirait :

this.physics.add.collider(player, platforms);

Ceci est en fait une notation abrégée! La notation complete est :

this.physics.add.collider(player, platforms, null , null);

Il est possible d’ajouter à ses paramètres 2 fonctions particulières qui remplaceraient null et null :

  • une fonction dite de collideCallback, qui est exécutée si les deux objets se touchent,
  • et une fonction dite de processCallback, qui peut valider vraiment la collision lorsque deux objets se touchent … ou pas ! C’est de cette seconde fonction que nous allons discuter.

Lorsque la fonction de processCallback n’existe pas, les deux objets rentrent toujours en collision quand ils se touchent. Mais si la fonction de processCallback existe, les objets rentreront en collision si et seulement si la fonction de processCallback renvoie true. Cette fonction, lorsqu’elle est exécutée, prend en paramètre les deux objets qui sont rentrés en collision.

Dans l’exemple ci-dessous, on modifie la collision pour que cette dernière n’ait lieu que si le personnage player arrive sur la plate-forme, mais pas depuis le dessous (il ne se cognera pas). On modifie dans create() la fonction de collision comme suit :

this.physics.add.collider(player, platforms, null , verifCollision);

Il nous faut ajouter alors la fonction verifCollision() en dehors, qui prendra en paramètres les deux objets en collision, et retourne vrai si le player est au dessus :

function checkCollision (objet1, objet2) {
  if (objet1 == player && objet1.y < objet2.y) 
     return true;
  if (objet2 == player && objet1.y > objet2.y) 
     return true;
 return false;
}

Comme on ne sait pas si le player est le premier objet ou le second objet impliqué dans la collision, il faut ruser un peu pour le savoir. Cette fonction dit en gros que si le premier objet est le player et qu’il est situé au dessus du second, on retourne true, et la collision est active. Pareil si le second objet est le player et qu’il est au dessus du premier. Sinon on retourne faux.

Ces lignes suffisent pour ce que l’on veut faire!

Tags: ,

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *