Introduction
On constate ces dernières années, un regain d’importance pour le game design et l’originalité d’un jeu, au détriment de la qualité graphique. Le succès des jeux sur wii, ces casual games, en est la preuve. Mais ces jeux incluent bien souvent un élément important : le moteur physique. De nombreux jeux sont même uniquement basés sur ce genre d’interactions.
Avec l’utilisation croissante de technologies telles que XNA ou Silverlight, il est important de comprendre l’intérêt de ces moteurs physiques, et comment les utiliser. Une série d'articles va donc être consacrée à une présentation de l’un de ces moteurs Farseer physics, qui fonctionne avec ces deux technologies.
I)Introduction aux moteurs physiques et Farseer
1)Qu’est-ce qu’un moteur physique ?
Commençons par la base : Qu’est-ce qu’un moteur physique finalement ? Il s’agit d’un ensemble de fonctionnalités, classes et objets, qui permettent l’instauration de la gravité (et de ce que cela engendre), dans un espace. Imaginons que dans votre jeu, vous avez un personnage qui peut sauter. Concrètement, le moteur physique s’occupera tout seul d’appliquer une force à votre personnage, qui le fera d’abord monter, puis descendre. Finalement, les moteurs physiques aident grandement à reproduire les lois physiques de notre monde.
2) Qu’est-ce que Farseer Physics ?
Farseer Physics est un moteur physique open-source. Il est disponible pour Silverlight, XNA, WPF, mais dispose aussi de classes indépendantes de toute plateforme. Vous pouvez télécharger le contenu qui vous intéresse sur http://farseerphysics.codeplex.com. De nombreux exemples sont également disponibles.
3)Quelques exemples

- NinjaBall, un petit jeu fait en Silverlight avec Farseer Physics.

- Phun, un formidable simulateur physique.
II)Farseer Physics avec XNA
1)Intégrer Farseer Physics à votre projet
La première étape dans l’utilisation du moteur Farseer, est son intégration au sein du projet. Dans un premier temps, téléchargez-le sur le site de Farseer Physics sur Codeplex. Ajoutez ensuite le projet Farseer Physics pour XNA à votre solution. Ajoutez ensuite les assemblies suivants pour utilisez les classes du moteur :
using FarseerGames.FarseerPhysics;
using FarseerGames.FarseerPhysics.Collisions;
using FarseerGames.FarseerPhysics.Dynamics;
using FarseerGames.FarseerPhysics.Factories;
Vous voilà prét à découvrir les lois de la physique !
2)Ajouter la Gravité
Une fois le projet prêt, il vous faudra tout d’abord ajouter l’élément essentiel à votre projet : le PhysicsSimulator, qui aura pour rôle de gérer toute la physique de votre environnement. L’objet dispose de deux constructeurs. L’un ne prend aucun paramètre, l’autre accepte un vecteur de gravité.
PhysicsSimulator simulator = new PhysicsSimulator(new Vector2(0, 750));
Dans cet exemple, on créé un simulateur physique avec une force de gravité de 0 en X, et de 750 en Y. Cela correspond environ à une gravité normale. Maintenant que la gravité est integrée au système, il va falloir insérer des éléments qui y sont soumis.
3)Ajouter des corps
Tout objet a intégré à l’environnement physique est appelé un corps. Ceux-ci sont composés de Body et de Geom Le Body correspond à la position et les caractéristiques physiques du corps. Le Geom, lui, détermine la forme de celui-ci, et permet de gérer les collisions. Pour créer un Body, il vous faudra utiliser un objet statique nommé BodyFactory. La méthode de création prend pour argument la largeur du corps, la hauteur, la masse, et éventuellement le PhysicsSimulator.
body = BodyFactory.Instance.CreateRectangleBody(width, height, 1);
Nous allons utiliser la même méthode ensuite pour la géométrie. La méthode de construction prend en paramètre un corps auquel la géométrie est attachée, ainsi qu’une largeur et une hauteur. 7 autres constructeurs sont disponibles pour gérer les différentes situations.
geom = GeomFactory.Instance.CreateRectangleGeom(body, width, height);
Ensuite, il vous faudra ajouter tout simplement ces objets au simulateur physique.
simulator.Add(body);
simulator.Add(geom);
Et voilà, vos objets physiques sont integrés au simulateur. Mais comment visualiser ces objets ? Pourquoi ne pas afficher une image qui changera de position avec le corps ?
Texture2D texture;
Body body;
Geom geom;
protected override void LoadContent()
{
PhysicsSimulator simulator = new PhysicsSimulator(new Vector2(0, 750));
texture = Content.Load<Texture2D>(@"gfx/img");
body = BodyFactory.Instance.CreateRectangleBody(100, 100, 1);
geom = GeomFactory.Instance.CreateRectangleGeom(body, width, height);
simulator.Add(body);
simulator.Add(geom);
}
protected override void Update(GameTime gameTime)
{
simulator.Update(gameTime.ElapsedGameTime.Milliseconds * .001f);
base.Update(gameTime);
}
protected override void Draw(GameTime gameTime)
{
GraphicsDevice.Clear(Color.CornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(texture, new Rectangle(body.Position.X, body.Position.Y, 100, 100)
,Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
Et voilà, ce code vous permettra de suivre “en direct”, la chute d’un objet soumis aux lois de la gravité. Vous pouvez vous amuser à changer les valeurs des différents éléments.
Et que faire si vous voulez rendre votre objet statique, indispensable pour faire un plateformer. Il vous suffit de mettre à true l’attribut IsStatic.
4)Gestion des collisions
Une fois vos corps créés, vous voudrez peut-être les faire interagir entre eux. La gestion des collisions avec Farseer Physics se fait très simplement. Il vous suffira d’ajouter un élément de type CollisionEventHandler sur l’événement OnCollision de votre Geom.
geom.OnCollision += new CollisionEventHandler(CollisionOccursPlay1);
La méthode recevra trois arguments : les deux corps qui sont entrés en collision, et un objet de type ContactList, qui contient, comme son nom l’indique, les points de contact. A vous ensuite de gérer les collisions comme vous le souhaitez !
Vous êtes à présent parés pour gérer la gravité dans votre jeu !
III)Farseer Physics avec Silverlight
1)Intégrer Farseer Physics à votre projet Silverlight
L’intégration de Farseer en Silverlight se fait de la même manière qu’en XNA si vous souhaitez utiliser le moteur physique dans votre code behind. Cependant, il est possible, comme nous allons le voir, d’utiliser Farseer sans une seule ligne de code, en usant de behaviors dans Expression Blend.
2)Utiliser Farseer avec les behaviors
Si vous êtes un utilisateur de Expression Blend, vous savez certainement ce qu’est un behavior. C’est une extension à des contrôles existants, pour l’ajout d’effets par exemple, et cela, sans ligne de code. Il vous faudra, pour utiliser ceux de Farseer, intégrer la bonne dll au projet.
Commencez par convertir votre LayoutRoot en Canvas. Cela est une pratique courante dans la programmation de jeux, et vous sera très utile plus tard. Dessinez ensuite une ellipse.

- Le début d'un nouveau jeu?
Une fois cela fait, vous avez les bases du prochain jeu Silverlight de l’année !
Faites glisser depuis votre liste de behaviors, le PhysicsControllerBehavior, sur votre Canvas. Vous pourrez y modifier divers paramètres dans la fenêtre de propriété, comme la gravité. Je vous conseille de cocher la case « MousePickEnabled », pour pouvoir diriger votre balle comme vous le souhaitez. Ajoutez ensuite le behavior « PhysicsObjectBehavior », le plus utile de tous. C’est en effet lui qui va déterminer si un objet réagit à la physique ou non. Encore une fois, il est possible de gérer divers propriétés, comme la masse, le moment d’inertie etc. Compilez, exécutez, et admirez le travail. Votre balle tombe, et est déplaçable avec la souris.
Vous pouvez vous amuser à rajouter quelques éléments, et modifier leurs propriétés physiques.
Mais comment faire si l’on souhaite gérer des événements physiques ? C’est possible soit en code-behind, soit directement dans Blend, et oui ! Nous allons par exemple, appliquer une force à notre balle, à chaque fois que la touche espace est relâchée. Glissez donc le behavior « PhysicsApplyForceBehavior » dessus. Dans la fenêtre des propriétés, il vous sera proposé de rajouter un EventTrigger pour déclencher l’application de la force. Cliquez sur « New ». Vous verrez apparaître une liste d’événements.

- De nombreux Triggerrs sont disponibles
Nous allons donc rajouter un trigger de type « KeyTrigger ». Il vous faudra ensuite mettre le Parent de l’événement, typiquement, il s’agit de votre LayoutRoot. La petite icône de cible vous permettra de cibler directement votre Canvas. Réglez ensuite le type d’événement associé (KeyUp ou keyDown ici), la force à appliquer, et la touche qui déclenchera l’événement, avec éventuellement une touche supplémentaire (comme Alt, Shift etc.).
Vous pouvez tester maintenant, et votre balle réagit aux événements ! Attention cependant, vérifiez bien que votre Canvas a le focus, sinon les entrées clavier ne seront pas prises en compte. Et voilà le résultat :

- Une expérience physique originale et ludique.
Il est possible de gérer de nombreuses choses en mixant les behaviors et du code behind. Vous pourrez trouver beaucoup d’informations et de tutoriaux sur la page Codeplex de Farseer, y compris une vidéo sur le mélange entre les behaviors et du traitement en C#.
3)Utiliser Farseer dans votre code behind
Utiliser Farseer se fait presque de la même manière qu’en XNA. Votre code sera donc facilement portable de l’un à l’autre. Vous pouvez initialiser le moteur physique comme en XNA. Le seul changement concerne la gestion du temps pour mettre à jour le moteur. En effet, en XNA, la boucle de jeu, et donc le temps, sont gérés automatiquement, ce qui n’est pas le cas de base en Silverlight.
Le plus simple est certainement de faire un storyboard, et de lui mettre la durée que vous souhaitez. Mais il est aussi possible de réaliser une boucle automatiquement grâce à l’objet CompositiionTarget, qui vous permettra de réaliser des boucles de jeu, de sorte que votre application ait bien 60 FPS (frames par seconde). Vous pouvez associer une méthode à son événement Rendering, pour ainsi avoir une boucle de jeu prête !
Conclusion
Vous savez à présent comment gérer la physique dans vos jeux, que ce soit avec XNA et Silverlight. Le moteur Farseer n’est certainement pas le plus complet des moteurs physiques, mais il a l’avantage d’être compatible avec .NET, et d’être simple d’utilisation. Un monde plein de gravité et de moments d’inertie vous attend désormais !
8d291714-fff6-469c-b4d6-83b540e485f2|0|.0
C#, XNA, Silverlight