Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

[WP7] Ajouter un peu de physique dans vos applications…

Pour les démonstrations des MsDays organisé par Exakis à Lyon, nous avons développé une application SilverLight sur le thème de l'Olympique Lyonnais. Si vous étiez présent à la session, vous avez pu voir ma démo avec les joueurs de l'OL sur un terrain et animés grâce à l'accéléromètre et associé à un moteur physique. En effet, suivant l’inclinaison du téléphone, chaque joueurs tombaient sur les bordures du terrain et s'entrechoquais l'un l'autre.

PICT1682 PICT1684

Le développement de cette fonctionnalité fut très simple et rapide. La première étape fut d'appeler les api qui permettent de récupérer les données de l'accéléromètre via la références à "Microsoft.Devices.Sensors".
Pour cela, l'exemple fournit par msdn est très clair (http://msdn.microsoft.com/en-us/library/ff637521%28VS.92%29.aspx).
L'exemple utilise la dernière innovation des DevLabs Microsoft, j'ai nommée Reactive Extensions for .NET ou Rx. (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) , pour émuler des données.

Rx est une bibliothèque pour composer des programmes asynchrones et basée sur des événements à l'aide des observable collections. Rx est un sur-ensemble des opérateurs LINQ standard qui expose des calculs asynchrones et basées sur des événements comme des collections observables, la transmission via les nouvelles interfaces .NET 4.0 IObservable et IObserver . Pour voir des exemples concrets de Rx, je vous invite à consulter: http://rxwiki.wikidot.com/101samples.

Pendant mon développement, je n'avais pas accès à un vrai device WP7, et le seul accéléromètre que j'avais à la maison étais ma manette wiimote. Comme le monde est bien fait Smile, il existe une api .net sur codeplex (http://wiimotelib.codeplex.com) qui permet de lire les données envoyer par la manette via bluetooth. Pour faire communiquer la manette et l’émulateur, la seul solution est de passer simplement par l’intermédiaire d’un serveur HTTP et d’utiliser un HttpListenerContext. Le serveur reçoit les données de la Wiimote, puis attend une requête avant de renvoyer les coordonnées x,y,z. Coté phone, il suffit de faire les appels vers le serveur HTTP local avec WebClient et de reconstruire un object vecteur grâce aux coordonnées. Dans ce cas, Rx nous aide à jouer avec les évènements...

var wiimote = new Wiimote();
wiimote.Connect();
wiimote.SetReportType(InputReport.IRAccel, true);
wiimote.SetLEDs(true, false, false, false);

HttpListener listener = new HttpListener();
listener.Prefixes.Add("http://*:12345/");
listener.Start();

Console.WriteLine("Wiimote and server are ready !");

wiimote.WiimoteChanged += (o, a) =>
{
        HttpListenerContext context = listener.GetContext();
        using (StreamWriter w = new StreamWriter(context.Response.OutputStream))
        {
            var p = a.WiimoteState.AccelState.Values;
            w.Write(string.Format("{0}:{1}:{2}", p.X, p.Y, p.Z));
            Console.WriteLine(string.Format("X={0} Y={1} Z={2}", p.X, p.Y, p.Z));
        }
        context.Response.Close();
        Thread.Sleep(50);
};
Maintenant que nous avons le vecteur de l'accéléromètre (le vrai ou celui de la wiimote), il est temps de mettre un peu de physique dans tout ça !
Pour cela, j’ai utilisé les extensions Farseer pour silverlight. Andy Beaulieu a effectué un super travail, ça librairie est très simple d’utilisation. Il suffit de mettre un canvas principal, 4 rectangles pour délimiter le terrain et 11 images pour les joueurs puis d’ajouter les behaviors correspondants:
<canvas x:name="mainCanvas">
<i:interaction.behaviors>
 <pb:physicscontrollerbehavior mousepickenabled="True" debugmode="False" />
</i:interaction.behaviors>
<img cachemode="BitmapCache" source="ol.png" canvas.left="214" canvas.top="12" />  <i:interaction.behaviors>
  <pb:physicsobjectbehavior />
 </i:interaction.behaviors>
</img>
<rectangle cachemode="BitmapCache" canvas.left="471" canvas.top="0" fill="Transparent" height="800" width="8">
 <i:interaction.behaviors>
  <pb:physicsobjectbehavior isstatic="True" />
 </i:interaction.behaviors>
 </rectangle>

Ensuite, il ne reste plus qu'a mettre la gravité à chaque évènenement reçu de l'accéléromètre sur le canvas principal :
public void SetGravity(int x, int y)
{
 var physicsControllerMain = mainCanvas.GetValue(PhysicsControllerMain.PhysicsControllerProperty) as PhysicsControllerMain;
 physicsControllerMain.Simulator.Gravity.X = x;
 physicsControllerMain.Simulator.Gravity.Y = -y;
}

Et voilà :), le tour est joué ! Le meilleur dans l'histoire, c'est que mon code était à 100% fonctionnel sur l’émulateur et sur le vrai téléphone.
Publié mercredi 7 juillet 2010 20:03 par Nicolas
Classé sous : ,
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

Pas de commentaires
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01