Collisions et physique : créer un simulateur de vaisseau spatial
CHAPITRE 10
229
GeomFactory.Instance.CreateRectangleGeom(physicsSimulator, body, 32,
➥32).OnCollision += new Geom.CollisionEventHandler(CollisionOccurs);
}
Il ne vous reste plus qu’à ajouter la fonction CollisionOccurs(), qui est appelée dès qu’un
événement a lieu. Nous avons vu sa signature avec IntelliSense au moment de la création
du délégué (figure 10-14).
private bool CollisionOccurs(Geom geomA, Geom geomB, ContactList contactList)
{
return true;
}
La fonction est encore incomplète, le temps de réfléchir un peu aux traitements à effectuer…
Si le vaisseau entre en collision avec un astéroïde, il a perdu : il faut le remettre à sa position
de départ et supprimer tous les astéroïdes. Il n’y a aucun problème pour appeler la fonction
ResetPosition() de la classe Player. Cependant, vous n’avez pas accès à la liste des
astéroïdes. Vous allez donc devoir vous-même faire parvenir un événement à la classe
ChapitreDix_2 pour qu’elle s’occupe de vider la liste.
Commencez par écrire le délégué et créer l’événement.
public delegate void ShipHasExplodedEventHandler();
public event ShipHasExplodedEventHandler ShipHasExploded;
Puis, appelez l’événement dans la fonction CollisionOccurs().
private bool CollisionOccurs(Geom geomA, Geom geomB, ContactList contactList)
{
ResetPosition();
ShipHasExploded();
return true;
}
Ensuite, dans la classe ChapitreDix_2, abonnez-vous à l’événement et écrivez la fonction
qui videra la liste.
protected override void Initialize()
{
physicsSimulator = new PhysicsSimulator();
ship = new Player(physicsSimulator);
ship.ShipDestroyed += new Player.ShipDestroyedEventHandler(ship_
➥ShipHasExploded);
base.Initialize();
}
Figure 10-14
Signature de la fonction à créer
=Labat FM.book Page 229 Vendredi, 19. juin 2009 4:01 16
Précédent

- 250/366

Suivant