EDIT : Cet article a été mis à jour pour XNA 4.0
Objectifs :
Pour cette deuxième partie nous allons nous intéresser à la création d’un programme affichant « Hello World » à l’écran en utilisant XNA.
Sommaire :
- Installation et découverte
- >>>>>Hello World
- Affichage d’images, de sprites, de backgrounds
- Déplacements, collisions, rotations
- Entrées / Sorties
- Squelette générique d’un jeu 2D
XNA : « Hello World »
Création d’un nouveau projet
Rentrons dans le vif du sujet. Commencez par créer un nouveau projet sur Visual Studio :
Vous vous retrouvez alors avec une classe déjà créée, remplie et ouverte sous vos yeux : Game1.cs. Votre solution contient aussi différents éléments. Assurez-vous déjà que tout marche bien en lançant votre premier jeu. Vous devriez obtenir un écran bleu. Pas le BSOD de Windows heureusement, mais un beau bleu dans une fenêtre :
Tout est prêt pour attaquer.
La classe Game
La base de tout jeu XNA est cette classe. Elle est lancée par la méthode Main contenue dans la classe Program, et elle définie un ensemble de méthodes qui simplifie l’organisation de son code.
Le schéma ci-dessus vous présente l’ordre d’appel des méthodes.
- Le constructeur (Game1()) est appelé en premier une seule fois.
- La méthode Initialize() sert à initialiser les variables du jeu (score, vies, etc). Elle est appelée juste après le constructeur, mais rien ne vous empêche de l’appeler par la suite.
- LoadContent() est primordiale. XNA utilise un Pipeline (tunnel) qui permet d’importer n’importe quoi (Sprite, image, modèle 3D, son, etc) dans le jeu très simplement. C’est dans cette méthode que doivent être chargées toutes les images, tous les sons, tous les médias nécessaires à votre jeu. Et tous ces médias doivent se trouver dans le dossier « Content » qui a été créé avec la solution. C’est un dossier spécial qui sera traité par le Pipeline.
- Un jeu est un programme composé principalement d’une boucle infinie. Cette boucle s’arrête quand l’utilisateur ferme le jeu. Chaque tour de boucle compose une Frame qui est affichée à l’écran. Pour qu’un jeu soit fluide il faut essayer d’avoir 60 Frames par secondes.
XNA synchronise deux threads en parallèle : la mise à jour du modèle (Update()) et de la vue (Draw()) . Ils tournent donc à la même vitesse et sont appelés une fois par frame (donc en moyenne 60 fois par secondes, excepté sur Windows Phone 7 qui est à ~30 frames par secondes).
- UnloadContent() peut servir à effectuer des actions particulières lors de la fermeture du jeu. Par défaut, les objets en mémoire sont désalloués.
Cette classe possède également deux attributs :
- GraphicsDeviceManager graphics
- SpriteBatch spriteBatch
On ne s’intéressera pour l’instant qu’au deuxième qui permet d’afficher à l’écran des textures (un sprite étant une texture appliqué sur un plan).
Afficher du texte
Autant vous prévenir tout de suite, XNA gère mal l’affichage du texte à l’écran. Cela n’empêche pas qu’il y a quelques méthodes existantes pour le faire.
La première chose à faire est de créer une police d’écriture qui sera chargée et utilisée par le jeu.
- Dans le dossier Content, clic droit
- Ajouter un nouveau élément
- Créer une nouvelle police : « Sprite Font«
Visual Studio vous ouvre alors le fichier spriteFont (XML), qui définit la taille, la police utilisée et d’autres informations modifiables si besoin.
Ajoutez un attribut SpriteFont à votre classe Game1.
GraphicsDeviceManager graphics;
SpriteBatch spriteBatch;
SpriteFont font;
Il faut ensuite charger la police avec le Pipeline (aussi appelé ContentManager). Dans LoadContent, ajoutez :
font = Content.Load<SpriteFont>(@"SpriteFont1");
Vous remarquerez :
- Le « @ » permet d’entrer dans la chaîne des caractères spéciaux sans qu’il ne soient interprétés (les « \ » par exemple)
- L’absence d’extension pour le fichier à charger. En effet le ContentManager transforme tout et l’accès aux fichiers transformés se fait sur le nom (asset name dans les propriétés) simplement.
Enfin, il faut ajouter au programme l’affichage d’un texte avec cette police.
Dans la méthode Draw(), ajoutez :
spriteBatch.Begin();
spriteBatch.DrawString(font, "Hello World !", new Vector2(), Color.Yellow);
spriteBatch.End();
Le spriteBatch est donc l’élément clé de tout affichage. Avant toute utilisation, il doit être initialisé avec Begin() (nous verrons plus tard les paramètres optionnels), et il doit être clos avec la méthode End().
Entre ces deux appels, vous pouvez faire différents affichages (qui utiliseront les paramètres spécifiés dans Begin(), mais ici, on s’en fiche
) de textes avec DrawString() ou de textures avec Draw().
Pour afficher notre « Hello World » nous utiliserons donc la première méthode, en lui passant en paramètre :
- La police (SpriteFont) à utiliser
- Le texte
- La position du texte, sous la forme d’un Vector2. Ici j’utilise un vecteur par défaut, à (0,0) mais vous pouvez changer ça dans les paramètres du constructeur.
- La couleur du texte. XNA définit une palette de couleurs conséquente dans la classe Color.
Vous obtiendrez un magnifique (tout est relatif) texte :
Nous allons voir par la suite comment afficher des images quelconques, des sprites ou des fonds d’écrans par exemple







Juste un truc au sujet du graphe de fonctionnement entre la boucle Update() et Draw(): contrairement à ce que l’on peut penser ces deux boucles ne sont pas apellées l’une après l’autre; le jeu maintient deux threads, un pour le rendu, et un pour l’update, ce qui fait que ces derniers peuvent tourner à une fréquence différente.
Il est vrai que dans la configuration de base, les deux threads fonctionnent à la même vitesse, ce qui fait qu’on peut avoir l’impression que le jeu appelle Update() puis Draw() l’un a la suite de l’autre. Mais il suffit que l’on shunte Game.IsFixedTimeStep pour ne plus être dans ce cas…
Ah merci, je ne le savais pas du tout =)
Je vais corriger ça alors.
Ping : Didacticiel XNA : Partie 5 – Entrées/Sorties | :: Valryon.blog ::