01 Managed Direct3D - La boucle de jeu

Dans cet article, je parle de la structure générale d'une application Managed Direct3D. La plupart des application Direct3D auraient un code qui ressemble à celui-ci.

Ne nous leurrons pas, la plupart des gens qui utilisent Direct3D ont certainement l'intention d'écrire un jeu. Donc c'est logique que la structure globale puisse être appelée "La boucle de jeu" (j'ai volé ce terme dans un livre moisi The Zen of Direct3D Game Programming). Ce code ou une variante de celui ci devrait apparaître dans beaucoup d'applications Managed Direct3D y compris l'exemple de Microsoft fourni avec le SDK DirectX . Le code ressemble à cela :

using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace Craig.Samples.Direct3D { public class Game : System.Windows.Forms.Form { static void Main() { Game app = new Game(); app.InitializeGraphics(); app.Show(); while (app.Created) { app.Render(); Application.DoEvents(); } app.DisposeGraphics(); } } }

Tout de suite vous pouvez constater que c'est clairement différent d'une application WinForms habituelle. Ca m'a étonné de voir cette ptite boucle - le while (app.Created) - dans une application graphique. Je suis bien plus habitué à voir un appel à Application.Run, qui attend des évènements venant de la souris ou du clavier par exemple, appelle les gestionnaires d'évènements que j'aurais mis en place et sort lorsque le programme est terminé. Regardons le code de plus près.

using System.Drawing; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D;

Cette partie est relativement triviale. Nous allons utiliser des trucs venant de ces namespaces, donc épargnons nous de les taper à chaque fois. Notez bien qu'il faut avoir le SDK DirectX installé et avoir les références à Microsoft.DirectX.dll et Microsoft.DirectX.Direct3D.dll.

namespace Craig.Samples.Direct3D { public class Game : System.Windows.Forms.Form {

Le code précédent est en fait assez intéressant, car cela nous montre que nous écrivons en fait une classe qui dérive de System.Windows.Forms.Form exactement comme les autres application WinForms que vous aurez pu écrire. Donc, tous les trucs que vous savez sur les Windows Forms s'appliquent encore, nous avons juste à apprendre comment intégrer les parties concernant Direct3D.

static void Main() { Game app = new Game(); app.InitializeGraphics(); app.Show();

C'est ici que nous créons une nouvelle instance de la fenêtre (souvenez vous, Main est static, il n'y a pas encore d'instance), et ensuite que nous appelons InitializeGraphics que nous allons écrire par la suite. L'appel à app.Show() affiche juste la fenêtre.

while (app.Created) { app.Render(); Application.DoEvents(); }

Ceci est le coeur de l'application, là où elle va passer le plus de temps. Nous testons ici si la fenêtre a été fermée et, si ce n'est pas le cas, nous appelons notre methode Render. Render est la methode où tous les yolis dessins 3D sont faits, j'en parlerai plus en detail dans un prochain article. L'appel àApplication.DoEvents sert à traiter les messages évenementiels envoyés à la fenêtre - comme je l'ai dit, nous écrivons une application Windows Forms, donc nous ne pouvons pas ne pas nous occuper de ces messages.

La raison pour laquelle nous faisons comme cela, plutot que par exemple mettre un timer et effectuer le rendu lorsqu'il expire, est que notre jeu demenderait certainement autant de CPU qu'il pourrait avoir. Ainsi nous effectuons tout notre rendu dans une petite boucle plutot que de choisir l'habituelle approche "oh je vais faire quelquechose seulement quand un évenement windows apparaît". Mais bien sur, nous sommes quand même obligés de traiter les messages générés par Windows.

app.DisposeGraphics();

Evidement nous avons besoin de nettoyer une fois que nous avons fini, ainsi nous fournirons une methode DisposeGraphics qui devra être appelée dès que l'application s'apprête à être éteinte. Nous en reparlerons plus tard.

Vous pouvez y aller et compiler ce code - ça devrait rouler comme sur des roulettes mais il faut avoir écrit des méthodes vides pour InitializeGraphics, Render et DisposeGraphics. Evidemment, ça ne sera qu'une fenêtre vide. Pour faire quelquechose d'intéressant, nous aurons besoin d'un Device Direct3D dont je vais parler la prochaine fois.